Partials.Reduce = function (params) { var tabs = [{ text: "전체" }, { text: "전기" }, { text: '가스' } ]; var selectedTab = ko.observable(0); var dateBoxValue = ko.observable(new Date()); var initialized = false; var dataSource; function createDataSource() { return new DevExpress.data.DataSource({ store: Partials.api.RetrofitMonthly, paginate: false, map: function (item) { return item; }, filter: [ ["SiteId", "=", 1], ["BuildingId", "=", 1], ["Year", "=", dateBoxValue().getFullYear()] ] }); } function load(result) { } dateBoxValue.subscribe(function (e) { handleViewShown(); }); selectedTab.subscribe(function (e) { //handleViewShown(); }); var linearRegression = function (data) { var sum = [0, 0, 0, 0, 0], n = 0, results = []; for (; n < data.length; n++) { if (data[n][1] != null) { sum[0] += data[n][0]; sum[1] += data[n][1]; sum[2] += data[n][0] * data[n][0]; sum[3] += data[n][0] * data[n][1]; sum[4] += data[n][1] * data[n][1]; } } var gradient = (n * sum[3] - sum[0] * sum[1]) / (n * sum[2] - sum[0] * sum[0]); var intercept = (sum[1] / n) - (gradient * sum[0]) / n; for (var i = 0, len = data.length; i < len; i++) { var coordinate = [data[i][0], data[i][0] * gradient + intercept]; results.push(coordinate); } var string = 'y = ' + Math.round(gradient * 100) / 100 + 'x + ' + Math.round(intercept * 100) / 100; return { equation: [gradient, intercept], points: results, string: string }; }; var handleViewShown = function () { if (initialized == false) { initialized = true; var dataGrid = $("#gridContainer").dxDataGrid("instance"); dataGrid.option({ "export": { enabled: true, fileName: "ReduceMonthly" }, columns: [ { dataField: 'Month', caption: '월', width: '3%', }, { dataField: 'Baseyear.Measurement', caption: '사용량(kWh)', format: 'fixedPoint', cssClass: 'baseyear' }, { dataField: 'Baseyear.Days', caption: '사용기간', format: 'fixedPoint', cssClass: 'baseyear' }, { dataField: 'Baseyear.HDD', caption: 'HDD', format: 'fixedPoint', precision: 2, cssClass: 'baseyear' }, { dataField: 'Baseyear.CDD', caption: 'CDD', format: 'fixedPoint', precision: 2, cssClass: 'baseyear' }, { dataField: 'Regression', caption: 'Base(kWh)', format: 'fixedPoint', cssClass: 'baseyear' }, { dataField: 'Estimate.Measurement', caption: '사용량(kWh)', format: 'fixedPoint', cssClass: 'estimate' }, { dataField: 'Estimate.Days', caption: '사용기간', format: 'fixedPoint', cssClass: 'estimate' }, { dataField: 'Estimate.HDD', caption: 'HDD', format: 'fixedPoint', precision: 2, cssClass: 'estimate' }, { dataField: 'Estimate.CDD', caption: 'CDD', format: 'fixedPoint', precision: 2, cssClass: 'estimate' }, { dataField: 'CommonReduce', caption: '단순 절감량', format: 'fixedPoint', cssClass: 'reduce' }, { dataField: 'Normalization', caption: '정규화 절감량', format: 'fixedPoint', cssClass: 'reduce'}, { dataField: 'ReduceRate', caption: '절감율(%)', format: 'fixedPoint', precision: 2, cssClass: 'reduce' }, ] }); $("#gaugeContainer").dxCircularGauge({ value: viewModel.summary.reduce().rate, scale: { startValue: -100, endValue: 100, majorTick: { tickInterval: 10 } }, rangeContainer: { ranges: [ { startValue: -100, endValue: 0, color: '#92000A' }, { startValue: 0, endValue: 100, color: '#00920A' }, ], }, geometry: { startAngle: 180, endAngle: 0 }, valueIndicator: { type: 'rectangleNeedle', color: '#9B870C' }, }); } Partials.api.get("RetrofitMonthly", { SiteId: 1, BuildingId: 1, Year: dateBoxValue().getFullYear() }).done(function (result) { $("#gridContainer").dxDataGrid("instance").option({ dataSource: result }) var filter = result.filter(function (v) { if (v.Normalization && v.ReduceRate) { return v; } }); viewModel.summary.reduce({ amount: filter.reduce(function (p, c) { return p + c.Normalization; }, 0) / filter.length, rate: filter.reduce(function (p, c) { return p + c.ReduceRate; }, 0) / filter.length, }); $("#gaugeContainer").dxCircularGauge("instance").value(viewModel.summary.reduce().rate); viewModel.rateText((viewModel.summary.reduce().rate > 0) ? '절감' : ((viewModel.summary.reduce().rate < 0) ? '증가' : '')); }); }; var viewModel = { dateBoxValue: dateBoxValue, dataSource: createDataSource(), tabs: tabs, selectedTab: selectedTab, viewShown: handleViewShown, rateText: ko.observable(''), summary : { reduce : ko.observable({ amount : 0, rate: 0, }), }, onPrevious: function (e) { var date = new Date(dateBoxValue()); date.setFullYear(date.getFullYear() - 1); dateBoxValue(date); }, onNext: function (e) { var date = new Date(dateBoxValue()); date.setFullYear(date.getFullYear() + 1); dateBoxValue(date); } }; return viewModel; };