payment_index.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. $(function () {
  2. autoFlashHeight();
  3. const EmptyTenderHtml = [
  4. '<div class="jumbotron">',
  5. '<h3 class="display-6">还没有标段及目录数据</h3>',
  6. '</div>'
  7. ];
  8. function initTenderTree(folderList, tenderList) {
  9. tenderTree = [];
  10. const folders = folderList;
  11. const tenders = tenderList;
  12. function makeTenderTree(parent) {
  13. if (parent.is_leaf) {
  14. parent.children = _.filter(tenders, { folder_id: parent.id });
  15. if (parent.children.length > 0) {
  16. parent.is_tender = true;
  17. parent.children.forEach((value, index) => {
  18. value.level = parent.level + 1;
  19. });
  20. }
  21. } else {
  22. const children = _.filter(folders, { parent_id: parent.id });
  23. parent.children = children;
  24. if (children.length > 0) {
  25. for (const c of children) {
  26. makeTenderTree(c);
  27. }
  28. }
  29. }
  30. }
  31. const level0Folders = _.filter(folders, { level: 1 });
  32. for (const l of level0Folders) {
  33. makeTenderTree(l);
  34. tenderTree.push(l);
  35. }
  36. console.log(tenderTree);
  37. }
  38. function recursiveGetTenderNodeHtml (node, arr, pid) {
  39. const html = [];
  40. html.push('<tr fid="' + (node.parent_id !== undefined ? node.id: 0) + '" pid="' + pid + '">');
  41. // 名称
  42. html.push('<td style="width: 40%" class="in-' + node.level + '">');
  43. if (node.parent_id !== undefined) {
  44. // html.push('<span onselectstart="return false" style="{-moz-user-select:none}" class="fold-switch mr-1" title="收起" cid="'+ node.sort_id +'"><i class="fa fa-minus-square-o"></i></span> <i class="fa fa-folder-o"></i> ', node.name);
  45. html.push('<i class="fa fa-folder-o"></i> ', node.name);
  46. } else {
  47. html.push('<span class="text-muted mr-2">');
  48. html.push(arr.indexOf(node) === arr.length - 1 ? '└' : '├');
  49. html.push('</span>');
  50. //html.push('<a href="/tender/' + node.id + '">', node[c.field], '</a>');
  51. html.push('<a href="javascript: void(0)" id="' + node.id + '">', node.name, '</a>');
  52. }
  53. html.push('</td>');
  54. // 创建人
  55. html.push('<td style="width: 15%" class="text-center">', node.user_name ? node.user_name : '', '</td>');
  56. // 创建时间
  57. html.push('<td style="width: 15%">', node.in_time && node.parent_id === undefined ? moment(node.in_time).format('YYYY-MM-DD HH:mm:ss') : '', '</td>');
  58. // 审批流程
  59. html.push('<td style="width: 15%">');
  60. if (node.parent_id === undefined && auditPermission.process) {
  61. html.push('<a href="/payment/'+ node.id +'/process" target="_blank">设置</a>');
  62. }
  63. html.push('</td>');
  64. // 操作
  65. html.push('<td style="width: 15%">');
  66. if (uid === node.uid || (auditPermission.tender && node.is_leaf) || (auditPermission.folder && node.parent_id !== undefined && !node.is_tender)) {
  67. html.push('<div class="dropdown">\n' +
  68. ' <a href="#" class="dropdown-toggle text-primary" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">\n' +
  69. ' <i class="fa fa-bars"></i>\n' +
  70. ' </a>\n' +
  71. ' <div class="dropdown-menu">\n');
  72. if (uid === node.uid) {
  73. html.push('<a class="dropdown-item edit_name_btn" data-type="'+ (node.parent_id === undefined ? 'tender' : 'folder') +'" data-id="'+ node.id +'" href="javascript:void(0);"><i class="fa fa-edit mr-2"></i>重命名</a>\n');
  74. if (!node.had_tender) {
  75. html.push('<a class="dropdown-item show_del_btn" data-type="'+ (node.parent_id === undefined ? 'tender' : 'folder') +'" data-id="'+ node.id +'" href="javascript:void(0);"><i class="fa fa-remove mr-2"></i>删除</a>\n');
  76. }
  77. }
  78. if (uid === node.uid && ((auditPermission.tender && node.is_leaf) || (auditPermission.folder && node.parent_id !== undefined && !node.is_tender))) {
  79. html.push('<div class="dropdown-divider"></div>\n');
  80. }
  81. if (auditPermission.folder && node.parent_id !== undefined && !node.is_tender) {
  82. html.push('<a class="dropdown-item show_new_folder_btn" href="#add-folder" data-toggle="modal" data-target="#add-folder" data-parentName="'+ node.name +'" data-parentId="'+ node.id +'"><i class="fa fa-folder-o mr-2"></i>新建子目录</a>\n');
  83. }
  84. if (auditPermission.tender && node.is_leaf) {
  85. html.push('<a class="dropdown-item show_new_tender_btn" href="javascript:void(0);"><i class="fa fa-folder-o mr-2"></i>新建标段</a>\n');
  86. }
  87. html.push(' </div>\n' +
  88. ' </div>');
  89. }
  90. html.push('</td>');
  91. html.push('</tr>');
  92. if (node.children) {
  93. for (const c of node.children) {
  94. html.push(recursiveGetTenderNodeHtml(c, node.children, node.sort_id));
  95. }
  96. }
  97. return html.join('');
  98. }
  99. // 根据TenderTree数据获取Html代码
  100. function getTenderTreeHtml () {
  101. if (tenderTree.length > 0) {
  102. const html = [];
  103. html.push('<table class="table table-hover table-bordered">');
  104. html.push('<thead style="position: fixed;left:56px;top: 34px;">', '<tr>');
  105. html.push('<th class="text-center" style="width: 40%">', '名称', '</th>');
  106. html.push('<th class="text-center" style="width: 15%">', '创建人', '</th>');
  107. html.push('<th class="text-center" style="width: 15%">', '创建时间', '</th>');
  108. html.push('<th class="text-center" style="width: 15%">', '审批流程', '</th>');
  109. html.push('<th class="text-center" style="width: 15%">', '操作', '</th>');
  110. html.push('</tr>', '</thead>');
  111. parentId = 0;
  112. for (const t of tenderTree) {
  113. html.push(recursiveGetTenderNodeHtml(t, tenderTree, ''));
  114. }
  115. html.push('</table>');
  116. return html.join('');
  117. } else {
  118. return EmptyTenderHtml.join('');
  119. }
  120. }
  121. function makeList(folderList, tenderList) {
  122. initTenderTree(folderList, tenderList);
  123. $('.c-body').html(getTenderTreeHtml());
  124. setTopTr();
  125. }
  126. // 首次加载展示目录
  127. postData('/payment/list/load', {}, function (result) {
  128. allFolders = result.folderList;
  129. allTenders = result.tenderList;
  130. makeList(result.folderList, result.tenderList);
  131. });
  132. $('body').on('click', '.show_new_folder_btn', function () {
  133. if (parseInt($(this).attr('data-parentId')) === 0) {
  134. $('#parent_folder').hide();
  135. $('#parent_folder_name').val('');
  136. $('#add-folder').find('.modal-title').text('新建目录');
  137. $('#new_folder_name').siblings('label').text('目录名称');
  138. $('#parent_id').val(0);
  139. } else {
  140. $('#parent_folder').show();
  141. $('#parent_folder_name').val($(this).attr('data-parentName'));
  142. $('#add-folder').find('.modal-title').text('新建子目录');
  143. $('#new_folder_name').siblings('label').text('子目录名称');
  144. $('#parent_id').val($(this).attr('data-parentId'));
  145. }
  146. });
  147. function checkNameValid(_this) {
  148. const name = _.trim(_this.val());
  149. if(name === '') {
  150. _this.addClass('is-invalid');
  151. _this.siblings('.invalid-feedback').text('请输入名称');
  152. return false;
  153. }
  154. if(name.length > 100) {
  155. _this.addClass('is-invalid');
  156. _this.siblings('.invalid-feedback').text('名称超过100个字,请缩减名称');
  157. return false;
  158. }
  159. _this.removeClass('is-invalid');
  160. _this.siblings('.invalid-feedback').text('');
  161. return name;
  162. }
  163. $('#new_folder_btn').click(function () {
  164. const name = checkNameValid($('#new_folder_name'));
  165. if (name === false) {
  166. return;
  167. }
  168. postData('/payment/save', { type: 'add-folder', parentId: parseInt($('#parent_id').val()), name }, function (result) {
  169. allFolders = result.folderList;
  170. allTenders = result.tenderList;
  171. makeList(result.folderList, result.tenderList);
  172. $('#add-folder').modal('hide');
  173. })
  174. });
  175. $('body').on('click', '.edit_name_btn', function () {
  176. const type = $(this).attr('data-type');
  177. const id = parseInt($(this).attr('data-id'));
  178. const info = type === 'tender' ? _.find(allTenders, { id }) : _.find(allFolders, { id });
  179. if (!info) {
  180. toastr.error('目录或标段不存在');
  181. return;
  182. }
  183. $('#edit_name_input').val(info.name);
  184. $('#edit-name').find('.modal-title').text(type === 'tender' ? '修改标段' : '修改目录');
  185. $('#edit_name_id').val(info.id);
  186. $('#edit_name_type').val(type);
  187. $('#edit-name').modal('show');
  188. });
  189. $('#edit_name_btn').click(function () {
  190. const name = checkNameValid($('#edit_name_input'));
  191. if (name === false) {
  192. return;
  193. }
  194. const data = {
  195. type: $('#edit_name_type').val(),
  196. id: $('#edit_name_id').val(),
  197. name,
  198. };
  199. postData('/payment/save', { type: 'edit-name', postData: data }, function (result) {
  200. allFolders = result.folderList;
  201. allTenders = result.tenderList;
  202. makeList(result.folderList, result.tenderList);
  203. $('#edit-name').modal('hide');
  204. });
  205. });
  206. // 选中行并标记色
  207. $('body').on('click', '.c-body table tr', function () {
  208. $('.c-body table tr').removeClass('table-warning');
  209. $(this).addClass('table-warning');
  210. const fid = parseInt($(this).attr('fid'));
  211. const folderInfo = _.find(allFolders, { id: fid });
  212. if (auditPermission.tender && folderInfo && folderInfo.is_leaf) {
  213. $('#show_new_tender_btn').show();
  214. $('#add_tender_folder_id').val(fid);
  215. $('#add_tender_folder_name').val(folderInfo.name);
  216. $('#add_tender_name').removeClass('is-invalid');
  217. $('#add_tender_name').siblings('.invalid-feedback').text('');
  218. } else {
  219. $('#show_new_tender_btn').hide();
  220. }
  221. });
  222. $('body').on('click', '.show_new_tender_btn', function () {
  223. const fid = $('.c-body table').find('.table-warning').attr('fid');
  224. if (!fid) {
  225. toastr.error('请选中目录');
  226. return;
  227. }
  228. const folderInfo = _.find(allFolders, { id: parseInt(fid) });
  229. if (!folderInfo || folderInfo.is_leaf === 0) {
  230. toastr.error('目录不存在或存在子目录不能新建标段');
  231. return;
  232. }
  233. $('#add-tender').modal('show');
  234. });
  235. $('#new_tender_btn').click(function () {
  236. const name = checkNameValid($('#add_tender_name'));
  237. if (name === false) {
  238. return;
  239. }
  240. postData('/payment/save', { type: 'add-tender', folderId: parseInt($('#add_tender_folder_id').val()), name }, function (result) {
  241. allFolders = result.folderList;
  242. allTenders = result.tenderList;
  243. makeList(result.folderList, result.tenderList);
  244. $('#add-tender').modal('hide');
  245. });
  246. });
  247. $('body').on('click', '.show_del_btn', function () {
  248. const type = $(this).attr('data-type');
  249. const id = parseInt($(this).attr('data-id'));
  250. const info = type === 'tender' ? _.find(allTenders, { id }) : _.find(allFolders, { id });
  251. if (!info) {
  252. toastr.error('目录或标段不存在');
  253. return;
  254. }
  255. $('#edit_name_input').val(info.name);
  256. $('#del-project').find('.modal-title').text(type === 'tender' ? '删除标段' : '删除目录');
  257. $('#del-project').find('h6 span').text(info.name);
  258. $('#del_id').val(info.id);
  259. $('#del_type').val(type);
  260. $('#del-project').modal('show');
  261. });
  262. $('#del_btn').click(function () {
  263. const data = {
  264. type: $('#del_type').val(),
  265. id: $('#del_id').val(),
  266. };
  267. postData('/payment/save', { type: 'del', postData: data }, function (result) {
  268. allFolders = result.folderList;
  269. allTenders = result.tenderList;
  270. makeList(result.folderList, result.tenderList);
  271. $('#del-project').modal('hide');
  272. });
  273. });
  274. $(window).resize(setTopTr);
  275. // 设置表头固定并动态调整宽度高度
  276. function setTopTr() {
  277. for(let item = 0; item < $(".c-body table>thead>tr>th").length; item ++) {
  278. $(".c-body table>thead>tr>th").eq(item).outerWidth($(".c-body table>tbody>tr:first").children('td').eq(item).outerWidth());
  279. }
  280. $('.c-body table').css('margin-top', $(".c-body table>thead").height() - 4);
  281. // $('.c-body table').css('margin-top', -2);
  282. }
  283. });