financial_pay.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. 'use strict';
  2. let auditUtils;
  3. $(function () {
  4. autoFlashHeight();
  5. $('#tid_select').select2({
  6. language: 'zh-CN',
  7. theme: 'bootstrap4',
  8. selectOnClose: true,
  9. // width: '150',
  10. });
  11. $('#tid_select').change(function () {
  12. const tid = parseInt($(this).val()) || 0;
  13. setSelectValue('tid', tid);
  14. });
  15. $('#status_select .to-log-link').click(function () {
  16. const status = parseInt($(this).data('val')) || null;
  17. setSelectValue('status', status);
  18. });
  19. $('#used_select .to-log-link').click(function () {
  20. const used = $(this).data('val') || null;
  21. setSelectValue('used', used);
  22. });
  23. function setSelectValue(select, value) {
  24. const routes = [];
  25. if (from) {
  26. routes.push('from=' + from);
  27. }
  28. const tid = select === 'tid' ? value : $('#tid_select').val();
  29. if (tid) {
  30. routes.push('tid=' + tid);
  31. }
  32. const status = select === 'status' ? value : $('#status_selected').data('value');
  33. if (status) {
  34. routes.push('status=' + status);
  35. }
  36. const used = select === 'used' ? value : $('#used_selected').data('value');
  37. if (used) {
  38. routes.push('used=' + used);
  39. }
  40. if (getLocalCache('account-pageSize')) {
  41. routes.push('pageSize=' + getLocalCache('account-pageSize'));
  42. }
  43. window.location.href = `/sp/${spid}/financial/pay/stage/${fpsid}` + (routes.length ? '?' + routes.join('&') : '');
  44. }
  45. $('#add-pay').on('show.bs.modal', function () {
  46. let t = null;
  47. if (tenders.length > 0) {
  48. if (is_admin) {
  49. t = tenders[0];
  50. } else {
  51. const filterTender = tenders.filter(t => _.includes(fptReportTids, t.id));
  52. if (filterTender.length > 0) {
  53. t = filterTender[0];
  54. }
  55. }
  56. }
  57. $('#add-pay-tender').val(t ? t.id : '');
  58. changeTender(t);
  59. });
  60. $('#add-pay-tender').on('change', function () {
  61. const tender = tenders.find(t => t.id === parseInt($(this).val()));
  62. changeTender(tender);
  63. });
  64. $('#add-pay-btn').on('click', function () {
  65. const tid = $('#add-pay-tender').val();
  66. const tender = tenders.find(t => t.id === parseInt(tid));
  67. if (!tender) {
  68. toastr.error('请选择支付标段');
  69. return;
  70. }
  71. const code = $('#add-pay-code').val();
  72. if (!code) {
  73. toastr.error('请先去标段属性,填写合同编号');
  74. return;
  75. }
  76. const prop = {
  77. tid: tender.id,
  78. code: code,
  79. used: $('#add-pay-used').val(),
  80. };
  81. postData(`/sp/${spid}/financial/pay/stage/${fpsid}/save`, { type: 'add-pay', updateData: prop }, function (result) {
  82. window.location.href = `/sp/${spid}/financial/pay/${result.id}/detail`;
  83. });
  84. });
  85. $('body').on('click', '#pay-list .del-pay-btn', function () {
  86. const fpid = $(this).data('id');
  87. deleteAfterHint(function () {
  88. postData(`/sp/${spid}/financial/pay/stage/${fpsid}/save`, {type: 'del-pay', postData: { node: fpid }}, function (result) {
  89. window.location.reload();
  90. })
  91. }, '确认删除该资金支付?');
  92. });
  93. $('#batch-old-pays').click(function () {
  94. const pays = [];
  95. $('#contract-old-pay input[type="checkbox"]:checked').each(function () {
  96. const fpid = parseInt($(this).val());
  97. pays.push(fpid);
  98. });
  99. if (pays.length === 0) {
  100. toastr.error('请选择关联的旧数据');
  101. return;
  102. }
  103. console.log(pays);
  104. postData(`/sp/${spid}/financial/pay/stage/${fpsid}/save`, {type: 'batch-old-pays', postData: { payIds: pays }}, function (result) {
  105. window.location.reload();
  106. });
  107. });
  108. function changeTender(tender) {
  109. $('#add-pay-tender').val(tender ? tender.id : '');
  110. if (!tender) {
  111. toastr.warning('请先为项目添加标段再申请支付');
  112. return;
  113. }
  114. if (tender.dealCode) {
  115. $('#add-pay-code').val(tender.dealCode + '-' + moment().format('YYYYMMDD') + '-' + makeNum(tender.startNum));
  116. $('#add-pay-code').siblings('span').text('');
  117. } else {
  118. $('#add-pay-code').val('');
  119. $('#add-pay-code').siblings('span').html('请先去<a href="/tender/' + tender.id + '" target="_blank">标段属性</a>,填写合同编号');
  120. }
  121. }
  122. function makeNum(num) {
  123. let str = num.toString();
  124. while (str.length < 3) {
  125. str = '0' + str;
  126. }
  127. return str;
  128. }
  129. $('#audit-list').on('click', 'a', function() {
  130. const type = $(this).data('target')
  131. const auditCard = $(this).parent().parent()
  132. if (type === 'show') {
  133. $(this).data('target', 'hide')
  134. auditCard.find('.fold-card').slideDown('swing', () => {
  135. auditCard.find('#end-target').text($(this).data('idx') + '#')
  136. auditCard.find('#fold-btn').text('收起历史审核记录')
  137. })
  138. } else {
  139. $(this).data('target', 'show')
  140. auditCard.find('.fold-card').slideUp('swing', () => {
  141. auditCard.find('#end-target').text('1#')
  142. auditCard.find('#fold-btn').text('展开历史审核记录')
  143. })
  144. }
  145. });
  146. // 获取审批流程
  147. $('a[data-target="#sp-list" ]').on('click', function () {
  148. const data = {
  149. type: 'get-auditors',
  150. id: $(this).attr('c-id'),
  151. };
  152. postData(`/sp/${spid}/financial/pay/save`, data, function (result) {
  153. const { auditHistory, auditors2, user } = result;
  154. let auditorsHTML = [];
  155. auditors2.forEach((group, idx) => {
  156. if (idx === 0) {
  157. auditorsHTML.push(`<li class="list-group-item d-flex justify-content-between align-items-center">
  158. <span class="mr-1"><i class="fa fa fa-play-circle fa-rotate-90"></i></span>
  159. <span class="text-muted">${getGroupAuditHtml(group)}</span>
  160. <span class="badge badge-light badge-pill ml-auto"><small>原报</small></span>
  161. </li>`);
  162. } else if(idx === auditors2.length -1 && idx !== 0) {
  163. auditorsHTML.push(`<li class="list-group-item d-flex justify-content-between align-items-center">
  164. <span class="mr-1"><i class="fa fa fa-stop-circle fa-rotate-90"></i></span>
  165. <span class="text-muted">${getGroupAuditHtml(group)}</span>
  166. <div class="d-flex ml-auto">
  167. ${getAuditTypeHtml(group[0].audit_type)}
  168. <span class="badge badge-light badge-pill ml-auto"><small>终审</small></span>
  169. </div>
  170. </li>`);
  171. } else {
  172. auditorsHTML.push(`<li class="list-group-item d-flex justify-content-between align-items-center">
  173. <span class="mr-1"><i class="fa fa fa-chevron-circle-down"></i></span>
  174. <span class="text-muted">${getGroupAuditHtml(group)}</span>
  175. <div class="d-flex ml-auto">
  176. ${getAuditTypeHtml(group[0].audit_type)}
  177. <span class="badge badge-light badge-pill"><small>${transFormToChinese(idx)}审</small></span>
  178. </div>
  179. </li>`);
  180. }
  181. });
  182. $('#auditor-list').empty();
  183. $('#auditor-list').append(auditorsHTML.join(''));
  184. let historyHTML = [];
  185. auditHistory.forEach((his, idx) => {
  186. if (idx === auditHistory.length - 1 && auditHistory.length !== 1) {
  187. historyHTML.push(`<div class="text-right"><a href="javascript: void(0);" id="fold-btn" data-target="show">展开历史审批流程</a></div>`);
  188. }
  189. historyHTML.push(`<div class="${idx < auditHistory.length - 1 ? 'fold-card' : ''}">`);
  190. historyHTML.push(`<div class="text-center text-muted">${idx+1}#</div>`);
  191. historyHTML.push(`<ul class="timeline-list list-unstyled mt-2 ${ idx === auditHistory.length - 1 && auditHistory.length !== 1 ? 'last-auditor-list' : '' }">`);
  192. his.forEach((group, index) => {
  193. if (index === 0) {
  194. historyHTML.push(`<li class="timeline-list-item pb-2">
  195. <div class="timeline-item-date">
  196. ${group.beginYear}
  197. <span>${group.beginDate}</span>
  198. <span>${group.beginTime}</span>
  199. </div>
  200. <div class="timeline-item-tail"></div>
  201. <div class="timeline-item-icon bg-success text-light"><i class="fa fa-caret-down"></i></div>
  202. <div class="timeline-item-content">
  203. <div class="py-1">
  204. <span class="text-black-50">原报</span>
  205. <span class="pull-right text-success">${idx !== 0 ? '重新' : '' }上报审批</span>
  206. </div>
  207. <div class="card">
  208. <div class="card-body px-3 py-0">
  209. <div class="card-text p-2 py-3 row">
  210. <div class="col">
  211. <span class="h6">${user.name}</span>
  212. <span class="text-muted ml-1">${user.role}</span>
  213. </div>
  214. <div class="col">
  215. <span class="pull-right text-success"><i class="fa fa-check-circle"></i></span>
  216. </div>
  217. </div>
  218. </div>
  219. </div>
  220. </div>
  221. </li>`);
  222. }
  223. historyHTML.push(`<li class="timeline-list-item pb-2 ${ group.status === auditConst.status.uncheck && idx === auditHistory.length - 1 && auditHistory.length !== 1 ? 'is_uncheck' : ''}">`);
  224. if (group.endYear) {
  225. historyHTML.push(`<div class="timeline-item-date">${group.endYear}<span>${group.endDate}</span><span>${group.endTime}</span></div>`);
  226. }
  227. if (index < his.length - 1) {
  228. historyHTML.push('<div class="timeline-item-tail"></div>');
  229. }
  230. if (group.status === auditConst.status.checked) {
  231. historyHTML.push('<div class="timeline-item-icon bg-success text-light"><i class="fa fa-check"></i></div>');
  232. } else if (group.status === auditConst.status.checkNo) {
  233. historyHTML.push('<div class="timeline-item-icon bg-warning text-light"><i class="fa fa-level-up"></i></div>');
  234. } else if (group.status === auditConst.status.checking) {
  235. historyHTML.push('<div class="timeline-item-icon bg-warning text-light"><i class="fa fa-ellipsis-h"></i></div>');
  236. } else if (group.status === auditConst.status.checkAgain) {
  237. historyHTML.push('<div class="timeline-item-icon bg-warning text-light"><i class="fa fa-check"></i></div>');
  238. } else {
  239. historyHTML.push('<div class="timeline-item-icon bg-secondary text-light"></div>');
  240. }
  241. historyHTML.push('<div class="timeline-item-content">');
  242. historyHTML.push('<div class="py-1">');
  243. const statuStr = group.status !== auditConst.status.uncheck ?
  244. `<span class="pull-right ${auditConst.statusClass[group.status]}">${auditConst.statusString[group.status]}</span>` : '';
  245. historyHTML.push(`
  246. <span class="text-black-50">
  247. ${ group.audit_order === 0 ? '原报' : !group.is_final ? group.audit_order + '审' : '终审' } ${getAuditTypeText(group.audit_type)}
  248. </span>
  249. ${statuStr}`);
  250. historyHTML.push('</div>');
  251. historyHTML.push('<div class="card"><div class="card-body px-3 py-0">');
  252. for (const [i, auditor] of group.auditors.entries()) {
  253. historyHTML.push(`<div class="card-text p-2 py-3 row ${ ( i > 0 ? 'border-top' : '') }">`);
  254. historyHTML.push(`<div class="col"><span class="h6">${auditor.name}</span><span class="text-muted ml-1">${auditor.role}</span></div>`);
  255. historyHTML.push('<div class="col">');
  256. if (auditor.status === auditConst.status.checked) {
  257. historyHTML.push('<span class="pull-right text-success"><i class="fa fa-check-circle"></i></span>');
  258. } else if (auditor.status === auditConst.status.checkNo) {
  259. historyHTML.push('<span class="pull-right text-warning"><i class="fa fa-share-square fa-rotate-270"></i></span>');
  260. } else if (auditor.status === auditConst.status.checking) {
  261. historyHTML.push('<span class="pull-right text-warning"><i class="fa fa-commenting"></i></span>');
  262. } else if (auditor.status === auditConst.status.checkAgain) {
  263. historyHTML.push('<span class="pull-right text-warning"><i class="fa fa-check"></i></span>');
  264. }
  265. historyHTML.push('</div>');
  266. if (auditor.opinion) {
  267. historyHTML.push(`<div class="col-12 py-1 bg-light"><i class="fa fa-commenting-o mr-1"></i>${auditor.opinion}</div>`);
  268. }
  269. historyHTML.push('</div>');
  270. }
  271. historyHTML.push('</div></div>');
  272. historyHTML.push('</div>');
  273. historyHTML.push('</li>');
  274. });
  275. historyHTML.push('</div>');
  276. historyHTML.push('</ul>');
  277. });
  278. $('#audit-list').empty();
  279. $('#audit-list').append(historyHTML.join(''));
  280. });
  281. });
  282. $.subMenu({
  283. menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',
  284. toMenu: '#to-menu', toMiniMenu: '#to-mini-menu',
  285. key: 'menu.1.0.0',
  286. miniHint: '#sub-mini-hint', hintKey: 'menu.hint.1.0.1',
  287. callback: function (info) {
  288. if (info.mini) {
  289. $('.panel-title').addClass('fluid');
  290. $('#sub-menu').removeClass('panel-sidebar');
  291. } else {
  292. $('.panel-title').removeClass('fluid');
  293. $('#sub-menu').addClass('panel-sidebar');
  294. }
  295. autoFlashHeight();
  296. }
  297. });
  298. });
  299. const getGroupAuditHtml = function (group) {
  300. return group.map(u => { return `<small class="d-inline-block text-dark mx-1" title="${u.role}" data-auditorId="${u.aid}">${u.name}</small>`; }).join('');
  301. };
  302. const getAuditTypeHtml = function (type) {
  303. if (type === auditType.key.common) return '';
  304. return `<div class="li-subscript"><span class="badge badge-pill badge-${auditType.info[type].class} p-1 badge-bg-small"><small>${auditType.info[type].short}</small></span></div>`;
  305. };
  306. const getAuditTypeText = function (type) {
  307. if (type === auditType.key.common) return '';
  308. return `<span class="text-${auditType.info[type].class}">${auditType.info[type].long}</span>`;
  309. };