contract_panel.js 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. $(document).ready(function() {
  2. autoFlashHeight();
  3. const expensesPieValues = [
  4. {value: _.filter(expensesList, function (item) {
  5. return !item.settle_code && item.yf_price < item.total_price;
  6. }).length, name: '履行中'},
  7. {value: _.filter(expensesList, function (item) {
  8. return !item.settle_code && item.yf_price >= item.total_price;
  9. }).length, name: '已完成'},
  10. {value: _.filter(expensesList, function (item) {
  11. return !!item.settle_code;
  12. }).length, name: '已结算'}
  13. ];
  14. console.log(expensesPieValues);
  15. const expensesPieChart = echarts.init(document.getElementById('expensesPieChart'));
  16. const expensesPieOption = {
  17. color: ['#c7b8a1','#9ca8b8','#7b8b6f','#d8caaf'],
  18. tooltip: {
  19. trigger: 'item',
  20. formatter: '{a} <br/>{b}: {c} ({d}%)'
  21. },
  22. legend: {
  23. orient: 'horizontal',
  24. left: 0,
  25. data: ['履行中', '已完成', '已结算']
  26. },
  27. series: [
  28. {
  29. name: '合同',
  30. type: 'pie',
  31. radius: ['50%', '70%'],
  32. avoidLabelOverlap: false,
  33. label: {
  34. show: false,
  35. position: 'center'
  36. },
  37. emphasis: {
  38. label: {
  39. show: true,
  40. fontSize: '20',
  41. fontWeight: 'bold'
  42. }
  43. },
  44. labelLine: {
  45. show: false
  46. },
  47. data: expensesPieValues,
  48. }
  49. ]
  50. };
  51. expensesPieChart.setOption(expensesPieOption);
  52. // 按create_time月份整理expensesList数据
  53. const expensesBarDatas = [];
  54. for (const expenses of expensesList) {
  55. const yearMonth = moment(expenses.create_time).format('YYYY年MM月');
  56. const ymExpenses = _.find(expensesBarDatas, { yearMonth });
  57. if (ymExpenses) {
  58. ymExpenses.yf_price = ZhCalc.add(ymExpenses.yf_price, expenses.yf_price);
  59. } else {
  60. expensesBarDatas.push({ yearMonth, yf_price: expenses.yf_price });
  61. }
  62. }
  63. for (const e of expensesBarDatas) {
  64. e.rate = ZhCalc.round(ZhCalc.div(e.yf_price, prices.expenses_total_price) * 100, 2);
  65. }
  66. console.log(expensesBarDatas);
  67. const expensesBarChart = echarts.init(document.getElementById('expensesBarChart'));
  68. const expensesBarOption = {
  69. color: ['#b5c4b1','#965454','#9ca8b8','#d8caaf'],
  70. title : {
  71. text: '支出合同结算趋势'
  72. },
  73. tooltip : {
  74. trigger: 'axis'
  75. },
  76. calculable : true,
  77. legend: {
  78. data:['支付金额','占总金额比例']
  79. },
  80. dataZoom: [
  81. {show: true,start: 0, end: 100}
  82. ],
  83. xAxis : [
  84. {
  85. type : 'category',
  86. splitLine : {show : true},
  87. data : _.map(expensesBarDatas, 'yearMonth'),
  88. }
  89. ],
  90. yAxis : [
  91. {
  92. type : 'value',
  93. name : '金额',
  94. position:'left',
  95. axisLabel : {
  96. formatter: '{value} 元'
  97. },
  98. splitArea : {show : true}
  99. },
  100. {
  101. type : 'value',
  102. name:'占总金额比例',
  103. axisLabel : {
  104. formatter: '{value} %'
  105. },
  106. position: 'right',
  107. splitArea : {show : true}
  108. }
  109. ],
  110. series : [
  111. {
  112. name:'支付金额',
  113. type:'bar',
  114. tooltip : {formatter: "{b}<br/>{a}:{c} %"},
  115. stack: '结算金额',
  116. data: _.map(expensesBarDatas, 'yf_price'),
  117. },
  118. {
  119. name:'占总金额比例',
  120. type:'line',
  121. tooltip : {trigger: 'axis',formatter: "{b}<br/>{a}:{c} %"},
  122. yAxisIndex: 1,
  123. data: _.map(expensesBarDatas, 'rate'),
  124. },
  125. ]
  126. };
  127. expensesBarChart.setOption(expensesBarOption);
  128. const incomePieValues = [
  129. {value: _.filter(incomeList, function (item) {
  130. return !item.settle_code && item.yf_price < item.total_price;
  131. }).length, name: '履行中'},
  132. {value: _.filter(incomeList, function (item) {
  133. return !item.settle_code && item.yf_price >= item.total_price;
  134. }).length, name: '已完成'},
  135. {value: _.filter(incomeList, function (item) {
  136. return !!item.settle_code;
  137. }).length, name: '已结算'}
  138. ];
  139. console.log(incomePieValues);
  140. const incomePieChart = echarts.init(document.getElementById('incomePieChart'));
  141. const incomePieOption = {
  142. color: ['#c7b8a1','#9ca8b8','#7b8b6f','#d8caaf'],
  143. tooltip: {
  144. trigger: 'item',
  145. formatter: '{a} <br/>{b}: {c} ({d}%)'
  146. },
  147. legend: {
  148. orient: 'horizontal',
  149. left: 0,
  150. data: ['履行中', '已完成', '已结算']
  151. },
  152. series: [
  153. {
  154. name: '合同',
  155. type: 'pie',
  156. radius: ['50%', '70%'],
  157. avoidLabelOverlap: false,
  158. label: {
  159. show: false,
  160. position: 'center'
  161. },
  162. emphasis: {
  163. label: {
  164. show: true,
  165. fontSize: '20',
  166. fontWeight: 'bold'
  167. }
  168. },
  169. labelLine: {
  170. show: false
  171. },
  172. data: incomePieValues,
  173. }
  174. ]
  175. };
  176. // 为echarts对象加载数据
  177. incomePieChart.setOption(incomePieOption);
  178. const incomeBarDatas = [];
  179. for (const income of incomeList) {
  180. const yearMonth = moment(income.create_time).format('YYYY年MM月');
  181. const ymIncome = _.find(incomeBarDatas, { yearMonth });
  182. if (ymIncome) {
  183. ymIncome.yf_price = ZhCalc.add(ymIncome.yf_price, income.yf_price);
  184. } else {
  185. incomeBarDatas.push({ yearMonth, yf_price: income.yf_price });
  186. }
  187. }
  188. for (const i of incomeBarDatas) {
  189. i.rate = ZhCalc.round(ZhCalc.div(i.yf_price, prices.income_total_price) * 100, 2);
  190. }
  191. console.log(incomeBarDatas);
  192. const incomeBarChart = echarts.init(document.getElementById('incomeBarChart'));
  193. const incomeBarOption = {
  194. color: ['#a27e7e','#656565','#b5c4b1','#d8caaf'],
  195. title : {
  196. text: '收入合同结算趋势'
  197. },
  198. tooltip : {
  199. trigger: 'axis'
  200. },
  201. calculable : true,
  202. legend: {
  203. data:['回款金额','占总金额比例']
  204. },
  205. dataZoom: [
  206. {show: true,start: 0, end: 100}
  207. ],
  208. xAxis : [
  209. {
  210. type : 'category',
  211. splitLine : {show : true},
  212. data : _.map(incomeBarDatas, 'yearMonth'),
  213. }
  214. ],
  215. yAxis : [
  216. {
  217. type : 'value',
  218. name : '金额',
  219. position:'left',
  220. axisLabel : {
  221. formatter: '{value} 元'
  222. },
  223. splitArea : {show : true}
  224. },
  225. {
  226. type : 'value',
  227. name:'占总金额比例',
  228. axisLabel : {
  229. formatter: '{value} %'
  230. },
  231. position: 'right',
  232. splitArea : {show : true}
  233. }
  234. ],
  235. series : [
  236. {
  237. name:'回款金额',
  238. type:'bar',
  239. tooltip : {formatter: "{b}<br/>{a}:{c} %"},
  240. stack: '回款金额',
  241. data: _.map(incomeBarDatas, 'yf_price'),
  242. },
  243. {
  244. name:'占总金额比例',
  245. type:'line',
  246. tooltip : {trigger: 'axis',formatter: "{b}<br/>{a}:{c} %"},
  247. yAxisIndex: 1,
  248. data: _.map(incomeBarDatas, 'rate'),
  249. },
  250. ]
  251. };
  252. incomeBarChart.setOption(incomeBarOption);
  253. let resizeTimer = null;
  254. $(window).bind('resize', function () {
  255. if (resizeTimer) clearTimeout(resizeTimer);
  256. resizeTimer = setTimeout(function () {
  257. echartsReset();
  258. }, 500);
  259. });
  260. function echartsReset() {
  261. expensesPieChart.resize();
  262. incomePieChart.resize();
  263. expensesBarChart.resize();
  264. incomeBarChart.resize();
  265. }
  266. $.subMenu({
  267. menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',
  268. toMenu: '#to-menu', toMiniMenu: '#to-mini-menu',
  269. key: 'menu.1.0.0',
  270. miniHint: '#sub-mini-hint', hintKey: 'menu.hint.1.0.1',
  271. callback: function (info) {
  272. if (info.mini) {
  273. $('.panel-title').addClass('fluid');
  274. $('#sub-menu').removeClass('panel-sidebar');
  275. } else {
  276. $('.panel-title').removeClass('fluid');
  277. $('#sub-menu').addClass('panel-sidebar');
  278. }
  279. autoFlashHeight();
  280. }
  281. });
  282. });