useChart.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. import dayjs from 'dayjs'
  2. const chartDataItems = ref({
  3. datasetItems: {
  4. // 태양광(단상), 태양광(삼상) 연료전지, 풍력은 같은 아이템
  5. development_line1: {
  6. label: '',
  7. borderWidth : 2,
  8. borderColor:'#6EDBBB',
  9. lineTension : 0.5,
  10. pointRadius : 0,
  11. backgroundColor : (ctx) => { // bg 그라데이션 색으로 채울때 가변 채우고 비우고...
  12. const canvas = ctx.chart.ctx
  13. const gradient = canvas.createLinearGradient(0,0,0,300)
  14. gradient.addColorStop(0.7, '#ffffff')
  15. gradient.addColorStop(0, '#6edbbb')
  16. return gradient
  17. },
  18. data: [],
  19. type: 'line',
  20. fill : true,
  21. order: 1
  22. },
  23. // 태양열(강제) : 혼합차트
  24. development_mix1: [
  25. {
  26. label: 'test1',
  27. barPercentage: 0.4,
  28. backgroundColor: '#455DDC',
  29. data: [],
  30. type: 'bar',
  31. order: 2
  32. },
  33. {
  34. label: 'test2',
  35. borderWidth : 2,
  36. borderColor:'#6EDBBB',
  37. lineTension : 0.5,
  38. pointRadius : 0,
  39. data: [],
  40. type: 'line',
  41. fill : false,
  42. order: 1
  43. }
  44. ],
  45. // 태양열(자연)
  46. development_line2: {
  47. label: '',
  48. borderWidth : 2,
  49. borderColor:'#6EDBBB',
  50. lineTension : 0.5,
  51. pointRadius : 0,
  52. data: [],
  53. type: 'line',
  54. fill : false,
  55. order: 2
  56. },
  57. // 지열
  58. development_mix2: [
  59. {
  60. label: '',
  61. barPercentage: 0.8,
  62. backgroundColor: '#3549AE',
  63. data: [],
  64. type: 'bar',
  65. order:2
  66. },
  67. {
  68. label: '',
  69. barPercentage: 0.8,
  70. backgroundColor: '#78A6FF',
  71. data: [],
  72. type: 'bar',
  73. order:2
  74. },
  75. {
  76. label: '',
  77. borderWidth : 2,
  78. borderColor:'#6EDBBB',
  79. lineTension : 0.5,
  80. pointRadius : 0,
  81. data: [],
  82. type: 'line',
  83. fill : false,
  84. order:1
  85. }
  86. ],
  87. area_area: {
  88. label: '',
  89. barPercentage: 0.8,
  90. backgroundColor: "#3549AE",
  91. data: [],
  92. type: 'bar'
  93. },
  94. facility_line: {
  95. label: '',
  96. borderWidth : 2,
  97. lineTension : 0.5,
  98. pointRadius : 0,
  99. borderColor:'#3549AE',
  100. data: [],
  101. type: "line"
  102. },
  103. facility_consumption: {
  104. label: '',
  105. barPercentage: 0.4,
  106. backgroundColor: '#3549AE',
  107. data: [],
  108. type: 'bar',
  109. order: 1
  110. },
  111. facility_greed: {
  112. label: '',
  113. borderWidth : 2,
  114. borderColor:'#6EDBBB',
  115. lineTension : 0.5,
  116. pointRadius : 0,
  117. backgroundColor : (ctx) => { // bg 그라데이션 색으로 채울때 가변 채우고 비우고...
  118. const canvas = ctx.chart.ctx
  119. const gradient = canvas.createLinearGradient(0,0,0,300)
  120. gradient.addColorStop(0.8, '#ffffff')
  121. gradient.addColorStop(0, '#6edbbb')
  122. return gradient
  123. },
  124. data: [],
  125. type: 'line',
  126. fill : true,
  127. order: 2
  128. },
  129. }
  130. }
  131. )
  132. let chart = {
  133. customChartData(pageId, energyKey, timeSet, periodKey, resultData, areaType) {
  134. let labels = []
  135. let tempDataItem = []
  136. // 1. 메뉴 & 에너지원을 확인 => 그래프의 기본값을 셋팅
  137. if(pageId === 'development' || pageId === 'area') {
  138. if(!useUtil.isNull(areaType)) {
  139. if(energyKey === 'SP' || energyKey === 'TP' || energyKey === 'FC' || energyKey === 'WIND') {
  140. // 발전량 분석 > 에너지원 값이 태양광(단상), 태양광(삼상) 연료전지, 풍력 일 경우 development_line1 셋팅
  141. tempDataItem.push(chartDataItems.value.datasetItems.development_line1)
  142. } else if(energyKey === 'FORCE') {
  143. // 발전량 분석 > 에너지원 값이 태양열(강제) 일 경우 development_mix1 셋팅
  144. _each(chartDataItems.value.datasetItems.development_mix1, (item) => {
  145. tempDataItem.push(item)
  146. })
  147. } else if(energyKey === 'NATURE') {
  148. // 발전량 분석 > 에너지원 값이 태양열(자연) 일 경우 development_line2 셋팅
  149. tempDataItem.push(chartDataItems.value.datasetItems.development_line2)
  150. } else if(energyKey === 'GEO') {
  151. // 발전량 분석 > 에너지원 값이 지열 일 경우 development_mix2 셋팅
  152. _each(chartDataItems.value.datasetItems.development_mix2, (item) => {
  153. tempDataItem.push(item)
  154. })
  155. }
  156. } else {
  157. // 지역별 분석 => 지역이 전국이면 공통 막대그래프 셋팅
  158. tempDataItem.push(chartDataItems.value.datasetItems.area_area)
  159. }
  160. }
  161. else{
  162. if(!useUtil.isNull(areaType)) {
  163. if(areaType == 'stack'){
  164. tempDataItem.push(chartDataItems.value.datasetItems.facility_greed)
  165. }
  166. else if(areaType == 'type'){
  167. tempDataItem.push(chartDataItems.value.datasetItems.facility_line)
  168. }
  169. else if(areaType == 'consumption'){
  170. tempDataItem.push(chartDataItems.value.datasetItems.facility_consumption)
  171. }
  172. }
  173. }
  174. // label에 대해 가공처리
  175. if(pageId === 'development' || pageId === 'facilities' || pageId === 'area') {
  176. if(!useUtil.isNull(areaType)) {
  177. if(timeSet === 'hour') {
  178. if(periodKey === 'day') {
  179. _each(resultData.chart_date_list, (item) => {
  180. labels.push(dayjs(item).format('H:mm'))
  181. })
  182. } else {
  183. _each(resultData.chart_date_list, (item) => {
  184. labels.push(dayjs(item).format('MM/DD H:mm'))
  185. })
  186. }
  187. } else if(timeSet === 'day') {
  188. _each(resultData.chart_date_list, (item) => {
  189. labels.push(dayjs(item).format('MM/DD'))
  190. })
  191. } else if(timeSet === 'month') {
  192. _each(resultData.chart_date_list, (item) => {
  193. labels.push(dayjs(item).format('YYYY/MM'))
  194. })
  195. }
  196. } else {
  197. _each(resultData.chart_date_list, (item) => {
  198. labels.push(item)
  199. })
  200. }
  201. }
  202. // 범례에 대한 셋팅
  203. if(pageId === 'development' || pageId === 'area'){
  204. let idx = 0
  205. for(let i = 1; i <= Object.keys(resultData).length - 1; i++) {
  206. const chartKey = `chart_data_list_${i}`
  207. tempDataItem[idx].label = resultData[chartKey].legend
  208. tempDataItem[idx].data = resultData[chartKey].chart_data
  209. idx += 1
  210. }
  211. }
  212. else{
  213. const chartKey = Object.keys(resultData).find(key=>key.startsWith('chart_data_list_'))
  214. tempDataItem[0].label = resultData[chartKey].legend
  215. tempDataItem[0].data = resultData[chartKey].chart_data
  216. }
  217. return {labels: labels, chartData: tempDataItem}
  218. }
  219. }
  220. export default chart