financial_summary.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. $(document).ready(function() {
  2. autoFlashHeight();
  3. postData('/financial/' + spid + '/summary/load', {}, function (result) {
  4. console.log(result);
  5. tenders = result.tenders;
  6. transferList = result.transferList;
  7. transferTenderList = result.transferTenderList;
  8. payList = result.payList;
  9. summaryObj.setTenderSelect(result.tenders);
  10. summaryObj.changeHtmlAndCharts(result.tenders, result.transferList, result.transferTenderList, result.payList);
  11. });
  12. $('#search-btn').click(function () {
  13. const tenderSelect = parseInt($('#tender-select').val());
  14. const startMonth = $('#start-month').val();
  15. const endMonth = $('#end-month').val();
  16. const condition = {};
  17. let newTransferList = _.cloneDeep(transferList);
  18. let newTransferTenderList = _.cloneDeep(transferTenderList);
  19. let newPayList = _.cloneDeep(payList);
  20. if (startMonth !== '' && endMonth !== '') {
  21. // 判断输入合法和endMonth大于startMonth
  22. if (!/^\d{4}-\d{2}$/.test(startMonth) || !/^\d{4}-\d{2}$/.test(endMonth)) {
  23. toastr.warning('请输入正确的日期格式');
  24. return;
  25. }
  26. if (startMonth > endMonth) {
  27. toastr.warning('结束日期不能小于开始日期');
  28. return;
  29. }
  30. newTransferList = _.filter(newTransferList, function (item) {
  31. return item.t_time >= startMonth && item.t_time <= endMonth;
  32. });
  33. newTransferTenderList = _.filter(newTransferTenderList, function (item) {
  34. return _.includes(_.map(newTransferList, 'id'), item.trid);
  35. });
  36. newPayList = _.filter(newPayList, function (item) {
  37. const thisMonth = moment(item.create_time).format('YYYY-MM');
  38. return thisMonth >= startMonth && thisMonth <= endMonth;
  39. });
  40. } else if (startMonth !== '' || endMonth !== '') {
  41. toastr.warning('请选择开始和结束日期查询');
  42. return;
  43. }
  44. newTransferTenderList = tenderSelect !== 0 ? _.filter(newTransferTenderList, { tid: tenderSelect }) : newTransferTenderList;
  45. newPayList = tenderSelect !== 0 ? _.filter(newPayList, { tid: tenderSelect }) : newPayList;
  46. const newTenders = tenderSelect !== 0 ? _.filter(tenders, condition) : tenders;
  47. summaryObj.changeHtmlAndCharts(newTenders, newTransferList, newTransferTenderList, newPayList, tenderSelect);
  48. });
  49. const summaryObj = {
  50. setTenderSelect: function (tenders) {
  51. let tenderSelectHtml = '<option value="0">全部</option>';
  52. for (const tender of tenders) {
  53. tenderSelectHtml += `<option value="${tender.id}">${tender.name}</option>`;
  54. }
  55. $('#tender-select').html(tenderSelectHtml);
  56. },
  57. changeHtmlAndCharts: function (tenders, transferList, transferTenderList, payList, tenderSelect = 0) {
  58. const transfer_price = tenderSelect !== 0 ? _.map(transferTenderList, 'hb_tp') : _.map(transferList, 'total_price');
  59. const transfer_sum_price = ZhCalc.sum(transfer_price);
  60. const pay_price = _.map(payList, 'total_price');
  61. const pay_sum_price = ZhCalc.sum(pay_price);
  62. const pend_sum_price = ZhCalc.sub(transfer_sum_price, pay_sum_price);
  63. const small_expenses_tp = _.map(payList, 'small_expenses_tp');
  64. const small_expenses_sum_price = ZhCalc.sum(small_expenses_tp);
  65. // 金额概况
  66. $('#transfer_price').text(transfer_sum_price.format2Str('#,##0.######'));
  67. $('#pay_price').text(pay_sum_price.format2Str('#,##0.######'));
  68. $('#pend_price').text(pend_sum_price.format2Str('#,##0.######'));
  69. // 支付进度
  70. const pay_progress = (ZhCalc.div(pay_sum_price, ZhCalc.add(pay_sum_price, pend_sum_price)) * 100).toFixed(0);
  71. const pend_progress = 100 - pay_progress;
  72. $('#pay_progress').html(`
  73. <div class="progress-bar bg-success" style="width: ${pay_progress}%;" data-placement="bottom" data-toggle="tooltip" data-original-title="累计支付:¥${pay_sum_price.format2Str('#,##0.######')}">${pay_progress}%</div>
  74. <div class="progress-bar bg-gray" style="width: ${pend_progress}%;" data-placement="bottom" data-toggle="tooltip" data-original-title="待支付:¥${pend_sum_price.format2Str('#,##0.######')}">${pend_progress}%</div>`);
  75. $('[data-toggle="tooltip"]').tooltip();
  76. // 资金支出明细
  77. let pay_used_html = '';
  78. payUsedOption.series[0].data = [];
  79. for (const used of usedList) {
  80. const usedPays = _.filter(payList, { used: used });
  81. if (usedPays.length > 0) {
  82. const used_price = _.map(usedPays, 'total_price');
  83. const used_sum_price = ZhCalc.sum(used_price)
  84. pay_used_html += `<tr class="text-center"><td>${used}</td><td>${used_sum_price.format2Str('#,##0.######')}</td> <td>${(pay_sum_price ? ZhCalc.div(used_sum_price, pay_sum_price) * 100 : 0).toFixed(2)}%</td></tr>`;
  85. payUsedOption.series[0].data.push({ value: used_sum_price, name: used });
  86. }
  87. }
  88. pay_used_html += `<tr class="text-center"><td><strong>合计</strong></td><td>${pay_sum_price.format2Str('#,##0.######')}</td> <td></td></tr>`;
  89. pay_used_html += `<tr class="text-center"><td>其中:小额支出</td><td>${small_expenses_sum_price.format2Str('#,##0.######')}</td><td>${(pay_sum_price ? ZhCalc.div(small_expenses_sum_price, pay_sum_price) * 100 : 0).toFixed(2)}%</td></tr>`;
  90. $('#pay_used_table').html(pay_used_html);
  91. // 标段支出概况图表
  92. tenderOption.xAxis[0].data = _.map(tenders, 'name');
  93. tenderOption.series[0].data = [];
  94. tenderOption.series[1].data = [];
  95. for (const t of tenders) {
  96. const transferTenders = _.filter(transferTenderList, { tid: t.id });
  97. const transfer_tender_price = ZhCalc.sum(_.map(transferTenders, 'hb_tp'));
  98. const payTenders = _.filter(payList, { tid: t.id });
  99. const pay_tender_price = ZhCalc.sum(_.map(payTenders, 'total_price'));
  100. tenderOption.series[0].data.push(transfer_tender_price);
  101. tenderOption.series[1].data.push(pay_tender_price);
  102. }
  103. tenderChart.setOption(tenderOption);
  104. // 支出明细占比图表
  105. payUsedChart.setOption(payUsedOption);
  106. // 小额支出占比
  107. paySeOption.series[0].data = [
  108. { value: small_expenses_sum_price, name: '小额支出' },
  109. { value: ZhCalc.sub(pay_sum_price, small_expenses_sum_price), name: '其他' },
  110. ];
  111. paySeChart.setOption(paySeOption);
  112. },
  113. }
  114. let resizeTimer = null;
  115. $(window).bind('resize', function () {
  116. if (resizeTimer) clearTimeout(resizeTimer);
  117. resizeTimer = setTimeout(function () {
  118. echartsReset();
  119. }, 500);
  120. })
  121. function echartsReset() {
  122. tenderChart.resize();
  123. payUsedChart.resize();
  124. paySeChart.resize();
  125. }
  126. //标段占比
  127. const tenderChart = echarts.init(document.getElementById('jlchart3'));
  128. const tenderOption = {
  129. tooltip: {
  130. trigger: 'axis',
  131. axisPointer: {
  132. type: 'shadow'
  133. }
  134. },
  135. legend: {},
  136. grid: {
  137. left: '3%',
  138. right: '4%',
  139. bottom: '3%',
  140. containLabel: true
  141. },
  142. xAxis: [
  143. {
  144. type: 'category',
  145. data: []
  146. }
  147. ],
  148. yAxis: [
  149. {
  150. type: 'value'
  151. }
  152. ],
  153. series: [
  154. {
  155. name: '累计划拨',
  156. type: 'bar',
  157. emphasis: {
  158. focus: 'series'
  159. },
  160. data: []
  161. },
  162. {
  163. name: '累计支付',
  164. type: 'bar',
  165. stack: 'Ad',
  166. emphasis: {
  167. focus: 'series'
  168. },
  169. data: []
  170. }
  171. ]
  172. };
  173. // tenderChart.setOption(tenderOption);
  174. //费用明细占比//
  175. const payUsedChart = echarts.init(document.getElementById('jlchart1'));
  176. const payUsedOption = {
  177. color: ['#9489fa', '#f06464', '#f7af59', '#f0da49', '#71c16f', '#2aaaef', '#5690dd', '#bd88f5', '#009db2', '#0780cf'],
  178. //backgroundColor: '#343a40 ',
  179. tooltip: {
  180. trigger: 'item'
  181. },
  182. legend: {
  183. orient: 'vertical',
  184. left:'60%',
  185. right:'20%',
  186. top: 'middle'
  187. },
  188. series: [
  189. {
  190. name: '金额',
  191. type: 'pie',
  192. top:'20',
  193. bottom:'20',
  194. right:'40%',
  195. radius: ['80%'],
  196. avoidLabelOverlap: false,
  197. label: {
  198. show: false,
  199. position: 'right'
  200. },
  201. emphasis: {
  202. label: {
  203. show: true,
  204. fontSize: '40',
  205. fontWeight: 'bold'
  206. }
  207. },
  208. labelLine: {
  209. show: false
  210. },
  211. data: [],
  212. }
  213. ]
  214. };
  215. // 为echarts对象加载数据
  216. // myChart1.setOption(option1);
  217. //小额支出概况//
  218. var paySeChart = echarts.init(document.getElementById('jlchart2'));
  219. var paySeOption = {
  220. color: [ '#71c16f', '#2aaaef'],
  221. //backgroundColor: '#343a40 ',
  222. tooltip: {
  223. trigger: 'item'
  224. },
  225. legend: {
  226. orient: 'vertical',
  227. left:'60%',
  228. right: '20%',
  229. top: 'middle'
  230. },
  231. series: [
  232. {
  233. name: '金额',
  234. type: 'pie',
  235. top:'20',
  236. bottom:'20',
  237. right:'40%',
  238. radius: ['80%'],
  239. avoidLabelOverlap: false,
  240. label: {
  241. show: false,
  242. position: 'right'
  243. },
  244. emphasis: {
  245. label: {
  246. show: true,
  247. fontSize: '40',
  248. fontWeight: 'bold'
  249. }
  250. },
  251. labelLine: {
  252. show: false
  253. },
  254. data: []
  255. }
  256. ]
  257. };
  258. // 为echarts对象加载数据
  259. // myChart2.setOption(option2);
  260. $.subMenu({
  261. menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',
  262. toMenu: '#to-menu', toMiniMenu: '#to-mini-menu',
  263. key: 'menu.1.0.0',
  264. miniHint: '#sub-mini-hint', hintKey: 'menu.hint.1.0.1',
  265. callback: function (info) {
  266. if (info.mini) {
  267. $('.panel-title').addClass('fluid');
  268. $('#sub-menu').removeClass('panel-sidebar');
  269. } else {
  270. $('.panel-title').removeClass('fluid');
  271. $('#sub-menu').addClass('panel-sidebar');
  272. }
  273. autoFlashHeight();
  274. }
  275. });
  276. });