plan-consume-regression-development.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. //예측 차트 2020.05.**************** kgpark
  2. BemsWebApplication.PlanConsumeRegressionDevelopment = function (params, viewInfo) {
  3. "use strict";
  4. var timeBoxForSearch = BWA.SearchView.createDateTimeBox($G.TimeTypesForDayOnly);
  5. var visiblePopup = ko.observable(false);
  6. var timer;
  7. var initialized = false;
  8. var virtualNormalPointHistory_CurrentValueGet = new BWA.Chart.VirtualNormalPointHistory_CurrentValueGet(BWA.UserInfo.SiteId()),
  9. ForecastingPointHistory_DayAheadValueGet = new BWA.Chart.ForecastingPointHistory_DayAheadValueGet(BWA.UserInfo.SiteId()),
  10. ForecastingPointHistory_HourAheadValueGet = new BWA.Chart.ForecastingPointHistory_HourAheadValueGet(BWA.UserInfo.SiteId());
  11. var timeTypesForSearch = ko.observableArray(),
  12. timeTypeIdForSearch = ko.observable(0),
  13. deferredForSearch = new $.Deferred();
  14. var chart = BWA.Chart.Instance('chartRT', 'dxChart');
  15. var locationEnableForSearch = ko.observable(true);
  16. // 2017.09.08 : 그리드 도표 작업 : 팝업창 추가
  17. // 팝업창뷰 보이기 속성 제어용 변수 선언
  18. var DataGridPopup_Visible = ko.observable(false);
  19. // 그래프 출력 이후 엑셀출력을 위한 팝업창을 위해 임시 저장용 배열 선언
  20. var dataArrayresult = ko.observableArray();
  21. // 2017.09.08 : 그리드 도표 작업 : 팝업창 추가
  22. timeTypesForSearch($G.TimeTypes);
  23. function handleViewShown() {
  24. if (initialized === false) {
  25. //alert('handleViewShown1'); // 3
  26. chart = chart(BWA.ChartOptions.PlanConsumeRegressionDevelopment.getChartOptions());
  27. initialized = true;
  28. }
  29. // 날짜 초기화 (오늘)
  30. timeBoxForSearch.setDefaultDateToday();
  31. handleSearchInSearchView();
  32. timer = setInterval(function () {
  33. //alert('timer'); // For Debugging
  34. var now = new Date();
  35. //if ((now.getMinutes() == 1 && now.getSeconds() == 30) || (now.getMinutes() == 5 && now.getSeconds() == 30)) {
  36. if (now.getMinutes() == 2 && now.getSeconds() == 30) {
  37. //alert('timer'); // For Debugging
  38. handleSearchInSearchView();
  39. }
  40. }, 1000);
  41. }
  42. function handleViewHidden() {
  43. $SearchView.visibleObservable(false); // hcLee 2015 03 23
  44. visiblePopup(false);
  45. clearInterval(timer); // hcLee 2015 06 12
  46. }
  47. function handleViewShowing() {
  48. }
  49. function refreshList() {
  50. }
  51. var searchViewOptions = {
  52. searchViewItems: [
  53. { id: 'TimeTypeId', defaultValue: 0, value: timeTypeIdForSearch, dataSource: timeTypesForSearch },
  54. { id: 'DateForHour', type: 'dateRange', isOnlyDate: true },
  55. ],
  56. promiseDataInSearchView: deferredForSearch.promise()
  57. };
  58. function handleSearchInSearchView() {
  59. visiblePopup(true);
  60. var dataArray = [];
  61. var date = timeBoxForSearch.getDate();
  62. if (moment()._d.getFullYear() == date.endDate.getFullYear() && moment()._d.getMonth() == date.endDate.getMonth() && moment()._d.getDate() == date.endDate.getDate()) {
  63. var endDate_current = new Date(moment()._d.getFullYear(), moment()._d.getMonth(), moment()._d.getDate(), moment()._d.getHours(), 0);
  64. var commonParameters_current = {
  65. TimeIntervalType: $Code.TimeIntervalType.HOUR,
  66. StartDate: date.startDate,
  67. EndDate: endDate_current
  68. };
  69. var commonParameters_today = _.extend({}, commonParameters_current, {
  70. EndDate: date.endDate
  71. });
  72. }
  73. else {
  74. var commonParameters_current = {
  75. TimeIntervalType: $Code.TimeIntervalType.HOUR,
  76. StartDate: date.startDate,
  77. EndDate: date.endDate
  78. };
  79. var commonParameters_today = commonParameters_current
  80. }
  81. var ElectricConsumptionParameters = {
  82. FacilityTypeId: 99,
  83. FacilityCode: 4863,
  84. PropertyId: 1
  85. };
  86. $.when(
  87. virtualNormalPointHistory_CurrentValueGet.apiGet(_.extend(ElectricConsumptionParameters, commonParameters_current)),
  88. ForecastingPointHistory_DayAheadValueGet.apiGet(_.extend(ElectricConsumptionParameters, commonParameters_today)),
  89. ForecastingPointHistory_HourAheadValueGet.apiGet(_.extend(ElectricConsumptionParameters, commonParameters_current))
  90. ).done(function (ObservedValues, DayAheadValues, HourAheadValues) {
  91. if (ObservedValues[0].length != 0 && DayAheadValues[0].length != 0 && HourAheadValues[0].length != 0) {
  92. var dataArray_Temp = [];
  93. var dataArray_Temp1 = [];
  94. var dataArray_Temp2 = [];
  95. var dataArray_Temp3 = [];
  96. _.each(ObservedValues[0][0], function (x) {
  97. dataArray.push({
  98. DateTime: moment(x.DateTime).toDate(),
  99. ObservedValue: x.Value
  100. });
  101. });
  102. _.each(DayAheadValues[0][0], function (x) {
  103. dataArray.push({
  104. DateTime: moment(x.DateTime).toDate(),
  105. DayAheadValue: x.Value
  106. });
  107. });
  108. _.each(HourAheadValues[0][0], function (x) {
  109. dataArray.push({
  110. DateTime: moment(x.DateTime).toDate(),
  111. HourAheadValue: x.Value
  112. })
  113. });
  114. // 2017.09.08 : 그리드 도표 작업 : 팝업창 추가
  115. _.each(ObservedValues[0][0], function (x) {
  116. dataArray_Temp.push({
  117. DateTime: BWA.Chart.getCustermTimeArgumentAxisString($Code.TimeType.QUARTERMIN, moment(x.DateTime).toDate()),
  118. ObservedValue: x.Value,
  119. });
  120. });
  121. _.each(DayAheadValues[0][0], function (x) {
  122. dataArray_Temp1.push({
  123. DateTime: BWA.Chart.getCustermTimeArgumentAxisString($Code.TimeType.QUARTERMIN, moment(x.DateTime).toDate()),
  124. DayAheadValue: x.Value
  125. });
  126. });
  127. _.each(HourAheadValues[0][0], function (x) {
  128. dataArray_Temp2.push({
  129. DateTime: BWA.Chart.getCustermTimeArgumentAxisString($Code.TimeType.QUARTERMIN, moment(x.DateTime).toDate()),
  130. HourAheadValue: x.Value
  131. })
  132. });
  133. // 배열을 하나로 합치자
  134. var array_length_size = Math.max(dataArray_Temp.length, dataArray_Temp1.length, dataArray_Temp2.length);
  135. for (var i = 0; i < array_length_size; i++) {
  136. if (i < dataArray_Temp.length) {
  137. dataArray_Temp3.push(
  138. {
  139. DateTime: dataArray_Temp1[i].DateTime,
  140. ObservedValue: dataArray_Temp[i].ObservedValue,
  141. DayAheadValue: dataArray_Temp1[i].DayAheadValue,
  142. HourAheadValue: dataArray_Temp2[i].HourAheadValue
  143. });
  144. }
  145. else {
  146. dataArray_Temp3.push(
  147. {
  148. DateTime: dataArray_Temp1[i].DateTime,
  149. ObservedValue: 0,
  150. DayAheadValue: dataArray_Temp1[i].DayAheadValue,
  151. HourAheadValue: 0
  152. });
  153. }
  154. }
  155. // 만약 일렬로 병합을 원한다면 아래코드를 사용
  156. //dataArray_Temp = dataArray_Temp1.concat(dataArray_Temp2);
  157. dataArrayresult = dataArray_Temp3;
  158. // 2017.09.08 : 그리드 도표 작업 : 팝업창 추가
  159. var options = BWA.ChartOptions.PlanConsumeRegressionDevelopment.getSeriesOptions();
  160. if (!_.isNull(date.startDate) && !_.isNull(date.endDate)) {
  161. options.argumentAxis.min = moment(date.startDate).add(-1, 'hours').toDate();
  162. options.argumentAxis.max = moment(date.endDate).add(1, 'hours').toDate();
  163. }
  164. chart().option('argumentAxis', null); // 2015 05 21 결국 이 코드가 필요 함 (시간 축 에러 해결)
  165. options.dataSource = dataArray;
  166. chart().option(options);
  167. $('#st').text('에너지 사용량 예측 비교');
  168. }
  169. else if (ObservedValues[0].length == 0) {
  170. utils.toast.show("[BemsMonitoringPointHourly] 데이터가 없습니다.", 'error');
  171. }
  172. else if (DayAheadValues[0].length == 0) {
  173. utils.toast.show("[BemsMonitoringPointForecastingDayAhead] 데이터가 없습니다.", 'error');
  174. }
  175. else if (HourAheadValues[0].length == 0) {
  176. utils.toast.show("[BemsMonitoringPointForecastingHourAhead] 데이터가 없습니다.", 'error');
  177. }
  178. visiblePopup(false);
  179. })
  180. .fail(function (error) {
  181. utils.toast.show("데이터를 불러오는데 실패 하였습니다.", 'error');
  182. visiblePopup(false);
  183. });
  184. }
  185. // 2017.09.08 : 그리드 도표 작업 : 팝업창 추가
  186. function DataGridPopup_ButtonClick() {
  187. // DevExpress.ui.notify("날짜가 일치하지 않는 데이타가 존재합니다", "fail", 1000);
  188. DataGridPopup_Visible(true);
  189. }
  190. function handlePopupShown() {
  191. // 컬럼명 업데이트
  192. viewModel.PlanConsumeRegressionDevelopmentDataGridOptions.columns[0].caption = "날짜";
  193. viewModel.PlanConsumeRegressionDevelopmentDataGridOptions.columns[1].caption = "실 사용량";
  194. viewModel.PlanConsumeRegressionDevelopmentDataGridOptions.columns[2].caption = "하루 전 예측량";
  195. viewModel.PlanConsumeRegressionDevelopmentDataGridOptions.columns[3].caption = "한시간 전 예측량";
  196. // 데이타소스 업데이트
  197. $("#PlanConsumeRegressionDevelopmentDataGrid_Container").dxDataGrid("instance").option("dataSource", dataArrayresult);
  198. // 팝업창 갱신
  199. DataGridPopup_Visible(true);
  200. // 2017.09.08 : 그리드 도표 작업 : 팝업창 추가
  201. }
  202. var viewModel = $.extend(BWA.CommonView.create(
  203. params, viewInfo, searchViewOptions, ko.observable(null), handleViewShown, null,
  204. handleSearchInSearchView), {
  205. refreshList: refreshList,
  206. viewShowing: handleViewShowing,
  207. viewHidden: handleViewHidden, // hcLee 2015 03 23
  208. //viewDisposing: handleViewHidden, // hcLee 2015 03 23
  209. locationEnableForSearch: locationEnableForSearch,
  210. // 2017.09.08 : 그리드 도표 작업 : 팝업창 추가
  211. PlanConsumeRegressionDevelopmentDataGridPopup_ButtonClicked: DataGridPopup_ButtonClick
  212. // 2017.09.08 : 그리드 도표 작업 : 팝업창 추가
  213. });
  214. // 2017.09.08 : 그리드 도표 작업 : 팝업창 추가
  215. // 그래프 도표 팝업창
  216. viewModel.PlanConsumeRegressionDevelopmentDataGridPopupOptions = {
  217. width: '480px',
  218. height: '830px', // cyim 2017.05.30 : 테스트 결과 Devextreme 버그임. px 로 지정하면 초기 출력시 정확하게 가운데에 있지만, auto 설정시 화면아래에 위치하게 됨
  219. contentTemplate: "content",
  220. showTitle: true,
  221. title: "도표",
  222. visible: DataGridPopup_Visible,
  223. dragEnabled: true,
  224. closeOnOutsideClick: true,
  225. shownAction: handlePopupShown,
  226. animation: window.utils.popup.createAnimation(),
  227. shading: false
  228. };
  229. // 2017.09.08 : 그리드 도표 작업 : 팝업창 추가
  230. // 2017.09.08 : 그리드 도표 작업 : 팝업창 추가
  231. viewModel.PlanConsumeRegressionDevelopmentDataGridOptions = {
  232. dataSource: dataArrayresult,
  233. columns: [
  234. { dataField: 'DateTime', width: '30%', alignment: 'center' },// dataType: 'date', format: 'yyyy-MM-dd HH:mm' },
  235. { dataField: 'ObservedValue', width: '23%', alignment: 'center', format: 'fixedPoint', precision: 2 },
  236. { dataField: 'DayAheadValue', width: '23%', alignment: 'center', format: 'fixedPoint', precision: 2 },
  237. { dataField: 'HourAheadValue', width: '23%', alignment: 'center', format: 'fixedPoint', precision: 2 }
  238. ],
  239. // 엑셀 출력
  240. "export": {
  241. enabled: true,
  242. fileName: '에너지 사용 예측 결과'
  243. }
  244. };
  245. /// 2017.09.08 : 그리드 도표 작업 : 팝업창 추가
  246. viewModel.timeBoxForSearch = timeBoxForSearch;
  247. return viewModel;
  248. };