/** * Views/Partial/LCA/WasteWater.cshtml is using this controller */ var arr = window.location.href.split("/"); if (arr[3].indexOf('app') == 0) baseUrl = ''; else baseUrl = '/' + arr[3]; angular.module('CarbonFootprint') .controller('LCAWasteWaterCtrl', ['$scope', '$http', '$routeParams', 'ParameterCacheService', 'JoinSurveyItemAndParameter', '$q', 'MultiLanguageService', 'ExportCsvService', function ($scope, $http, $routeParams, ParameterCacheService, JoinService, $q, MultiLanguageService, ExportCsvService) { // Multi-language resource object var resource; var options; // This property controlls modal form , will be passed to table-edit-modal directive $scope.modalFormOption = {}; $scope.model = []; $scope.sumKgCO2e = 0; $scope.summary = []; $scope.createProcess = function () { // Create an object & select it var toBeCreated = {}; toBeCreated.ID = 0; toBeCreated.LCAID = $routeParams.LCAID; // Set waste type (waste water) toBeCreated.Type = 0; // For modal form $scope.selectRow.toBeEdit = toBeCreated; $scope.modalFormOption.show = true; $scope.dataQualityOption = {}; $scope.dataQualityOption.data = {}; $scope.isEdit = false; // set $scope.baseUrl var baseUrl = $scope.baseUrl; if (typeof (baseUrl) === 'undefined' || baseUrl == null) { var arr = window.location.href.split("/"); if (arr[3].indexOf('app') == 0) baseUrl = ''; else baseUrl = '/' + arr[3]; $scope.baseUrl = baseUrl; } $scope.save = function () { // Join parameter value and calculate KgCO2e JoinService.joinAsync([toBeCreated]).then(function () { // update KgCO2e property setKgCO2e([toBeCreated]); $http.post($scope.baseUrl+'/api/Waste/Save/' + toBeCreated.LCAID + '/' + toBeCreated.ID, toBeCreated) .success(function (data) { // Join PollutionCategory and ProcessingPattern data into model data.PollutionCategory = getPollutionCategory(options[data.ParameterID]); data.ProcessingPattern = getProcessingPattern(options[data.ParameterID]); $scope.model.unshift(data); $scope.modalFormOption.show = false; calcTotalKgCO2e(); }) .error(function (error) { console.log(error); }); }); }; }; $scope.editProcess = function (selected) { var toBeEdit = $scope.selectRow.toBeEdit = angular.copy(selected); // Reset Processing pattern dropdown list options $scope.processingPatterns = []; angular.forEach(options, function (value) { if (value.search(toBeEdit.PollutionCategory) !== -1 && toBeEdit.PollutionCategory) { var processingPattern = getProcessingPattern(value); $scope.processingPatterns.push(processingPattern); } }); $scope.processingPatterns = filterDuplicatedData($scope.processingPatterns); $scope.modalFormOption.show = true; $scope.dataQualityOption = {}; $scope.dataQualityOption.data = {}; $scope.isEdit = true; $scope.save = function () { // Join parameter value and calculate KgCO2e JoinService.joinAsync([toBeEdit]).then(function () { // Update KgCO2e property setKgCO2e([toBeEdit]); $http.post($scope.baseUrl+'/api/Waste/Save/' + toBeEdit.LCAID + '/' + toBeEdit.ID, toBeEdit) .success(function (data) { // Join PollutionCategory and ProcessingPattern data into model toBeEdit.PollutionCategory = getPollutionCategory(options[toBeEdit.ParameterID]); toBeEdit.ProcessingPattern = getProcessingPattern(options[toBeEdit.ParameterID]); angular.copy(toBeEdit, selected); $scope.modalFormOption.show = false; calcTotalKgCO2e(); }) .error(function (error) { console.log(error); }); }); }; }; $scope.dataQualityShow = function (selected) { $http.get($scope.baseUrl+'/api/DataQualityLevel/GetByTableId/ProductLCAFabSurveyForm_Wastes/' + selected.ID ).success(function (data) { angular.copy(data, $scope.dataQualityOption.data); $scope.dataQualityOption.data.Name = selected.ParameterDescription; $scope.dataQualityOption.data.LCAID = selected.LCAID; //todo !!... load pre saved data //$scope.dataQualityOption.Fi = 0.0123;//test only; //todo !!... 還需要總碳排量才能算出 碳排量佔比 $scope.dataQualityOption.showSaveBtn = $scope.lcaDetail.Status == 1; $scope.dataQualityOption.show = true; }).error(function (data, status) { alert(data.ExceptionMessage); }); }; $scope.selectSimaproProcess = function (selected, isOutside = true) { $scope.simaproOption = {}; $scope.simaproOption.show = true; $scope.simaproOption.filter = 2; // SimaproOption.WasteWater 廢水 $scope.simaproOption.onOk = function (selectedParameter, selectedCategory) { //console.log(selectedParameter); selected.ParameterID = selectedParameter.ID; selected.ParameterTypeID = selectedCategory.ID; selected.ParameterValue = selectedParameter.Value; selected.ParameterDescription = selectedParameter.DisplayNameTW + ': ' + selectedParameter.Remark; selected.Unit = selectedParameter.Unit; selected.localDisplayParameterValue = selectedParameter.Value; selected.ParameterSource = selectedParameter.Description;// 2; selected.Description = selectedCategory.DisplayNameTW; if (isOutside) { LCADetailCacheService.updateMaterialsAsync([selected]); } $scope.updateKgCO2e(selected); //LCADetailCacheService.updateMaterialsAsync([selected]); } }; $scope.updateKgCO2e = function (selected) { selected.KgCO2e = selected.Scalar * selected.ParameterValue; } $scope.deleteProcess = function (selected) { var isConfirm = confirm(resource.DeleteItemMsg); if (isConfirm) { $http.delete('api/Waste/Delete/' + selected.ID) .success(function () { var index = $scope.model.indexOf(selected); $scope.model.splice(index, 1); // This operate is base on selectRow directive in TableEdit.js file $scope.selectRow.unSelect(); calcTotalKgCO2e(); }) .error(function () { console.log(error); }); } }; /* modelBuilder for create & export */ /** Caution!: The 'ParameterID' property depends on 'options'. This modelBuilder is binded with this controller. Refactoring modelBuilder.create() with more arugments will be better **/ $scope.modelBuilder = { create: function (data, LCAID) { try { // get DQIID by DQIName var DQIID; var DQIName = data[4]; if (DQIName == resource['MetaDataDQI1']) { DQIID = 0; } else if (DQIName == resource['MetaDataDQI2']) { DQIID = 1; } else if (DQIName == resource['MetaDataDQI3']) { DQIID = 2; } var model = { Scalar: parseFloat(data[0]) ? data[0] : 0, ParameterValue: parseFloat(data[1]) ? data[1] : 0, Unit: data[2], ParameterDescription: data[3], DQI: DQIID, Description: data[5], Type: 0, // Set waste type (other) LCAID: LCAID }; // check imported data length and model length (-1 for LCAID, -1 for Type) if (data.length !== getObjectSize(model) - 2) { throw resource['EXCELFileFormatWrong']; } // if find incorrect DQI if (model.DQI === undefined) { throw resource['MataDataDQI'] + resource['ErrorText'] + '\'' + resource['MetaDataDQI1'] + '\',\'' + resource['MetaDataDQI2'] + '\',\'' + resource['MetaDataDQI3'] + '\''; } return model; } catch (err) { return { error: err }; } }, export: function (list, exportType = 'txt') { if (exportType == 'csv') { var data = []; // header data.push([ resource['WaterQualityCMD'], resource['Parameter'], resource['ParameterUnit'], resource['ParaDesc'], resource['MataDataDQI'], resource['Notes'] ]); // body angular.forEach(list, function (entry) { var csv = []; //column 1 csv.push(entry.Scalar); //column 2 csv.push(entry.ParameterValue); //column 3 csv.push(entry.Unit); //column 4 csv.push(entry.ParameterDescription); //column 5 if (entry.DQI == 0) { csv.push(resource['MetaDataDQI1']); } else if (entry.DQI == 1) { csv.push(resource['MetaDataDQI2']); } else if (entry.DQI == 2) { csv.push(resource['MetaDataDQI3']); } //column 6 csv.push(entry.Description); data.push(csv); }); ExportCsvService.startExport(data, "Export_WasteWater.csv"); } //else { // var csv = '\uFEFF'; // var link; // var delimeter = '\t'; // // header // csv += resource['PollutionCategory'] + delimeter // + resource['ProcessingPatterns'] + delimeter // + resource['WaterQualityBOD'] + delimeter // + resource['WaterQualityCOD'] + delimeter // + resource['WaterQualityCMD'] + delimeter // + resource['MataDataDQI'] + delimeter // + resource['DQIDescription'] + delimeter // + resource['Notes']; // // body // angular.forEach(list, function (entry) { // csv += '\r\n'; // //column 1 // csv += entry.PollutionCategory + delimeter; // //column 2 // csv += entry.ProcessingPattern + delimeter; // //column 3 // csv += entry.WaterBOD + delimeter; // //column 4 // csv += entry.WaterCOD + delimeter; // //column 5 // csv += entry.WaterCMD + delimeter; // //column 6 // if (entry.DQI == 0) { // csv += resource['MetaDataDQI1'] + delimeter // } else if (entry.DQI == 1) { // csv += resource['MetaDataDQI2'] + delimeter // } else if (entry.DQI == 2) { // csv += resource['MetaDataDQI3'] + delimeter // } // //column 7 // csv += entry.DQIDescription + delimeter; // //column 8 // csv += entry.Description; // }) // var filename = "Export_WasteWater.txt"; // require([baseUrl+'/Scripts/FileSaver.js'], // function requrieSuccess(SaveAs) { // var textFileAsBlob = new Blob([csv], { type: 'text;charset=utf-8,' }); // saveAs(textFileAsBlob, filename) // }, // function requireError(error) { // } // ); //} } } /* file import options & modal control */ $scope.fileImportOptions = { modelBuilder: $scope.modelBuilder, saveAsync: batchCreateAndUpdateCache }; $scope.fileImportModal = { show: false }; /* quote options & modal control */ $scope.quoteOptions = { queryDataAsyncFn: function (LCAID) { var deferred = $q.defer(); getAllDataAsync(LCAID).then(function (data) { deferred.resolve(data.Wastes.filter(x => x.Type == 0)); }); return deferred.promise; }, saveAsyncFn: batchCreateAndUpdateCache }; $scope.quoteModal = { show: false }; // Get data and prepare $scope.model getAllDataAsync($routeParams.LCAID) .then(function (response) { options = response.OptionsOne; var sheetHeader = response.SheetHeader ? response.SheetHeader : {}; if (response.Wastes) { $scope.model = response.Wastes.filter(x => x.Type == 0); } // Get each model's PollutionCategory and ProcessingPattern by "ParameterID" angular.forEach($scope.model, function (model) { model.PollutionCategory = getPollutionCategory(options[model.ParameterID]); model.ProcessingPattern = getProcessingPattern(options[model.ParameterID]); }); // Sources of dropdown list $scope.pollutionCategories = []; angular.forEach(options, function (value) { var pollutionCategory = getPollutionCategory(value); $scope.pollutionCategories.push(pollutionCategory); }); calcTotalKgCO2e(); // Duplicated wasteCategories $scope.pollutionCategories = filterDuplicatedData($scope.pollutionCategories); // $scope.sheetHeader is parent's object $scope.sheetHeader.SheetFillerName = sheetHeader.SheetFillerName; $scope.sheetHeader.Phone = sheetHeader.Phone; $scope.sheetHeader.Department = sheetHeader.Department; }, function (error) { console.log(error); }); // Get multilanguage resource MultiLanguageService.getResourceAsync() .then(function (response) { resource = response; }, function (error) { console.log(error); }); /** * Private function: save all async * @param {[Array]} : array of parsed objects * @return {[promise]} */ function batchCreateAndUpdateCache(parsedList) { var deferred = $q.defer(); // Calculate KgCO2e and sava all JoinService.joinAsync(parsedList) .then(function () { // Update KgCO2e properties setKgCO2e(parsedList); $http.post($scope.baseUrl+'/api/Waste/SaveAll/', parsedList) .success(function (data) { // Close modals $scope.fileImportModal.show = false; $scope.quoteModal.show = false; // Join PollutionCategory and ProcessingPattern data into model angular.forEach(data.result, function (model) { model.PollutionCategory = getPollutionCategory(options[model.ParameterID]); model.ProcessingPattern = getProcessingPattern(options[model.ParameterID]); }); // Concat created data and $scope.model $scope.model = data.result.concat($scope.model); deferred.resolve(data); calcTotalKgCO2e(); }) .error(function (e) { console.log(e.Message); }); }); return deferred.promise; } /** * Update the KgCO2e property of the model objects * @param {[Array]} : array of model objects */ function setKgCO2e(models) { angular.forEach(models, function (entry) { // Use water COD to calculate scalar if water COD has value, else use water BOD to calculate scalar //if ((entry.WaterCOD || entry.WaterBOD) && entry.WaterCMD) { // entry.Scalar = (parseFloat(entry.WaterCOD) || parseFloat(entry.WaterBOD))*entry.WaterCMD; //} else { // entry.Scalar = 0; //} entry.KgCO2e = entry.Scalar * entry.ParameterValue;// .parameterResult; }); } /* Private function: get all list data from server */ function getAllDataAsync(LCAID) { var deferred = $q.defer(); $http.get($scope.baseUrl+'/api/Waste/GetByLcaId/' + LCAID) .success(function (data) { deferred.resolve(data); }) .error(function () { deferred.resolve(null); }); return deferred.promise; } $scope.$watch('selectRow.toBeEdit.PollutionCategory', function (pollutionCategory) { // If pollutionCategory is changed then reset processingPatterns $scope.processingPatterns = []; angular.forEach(options, function (value, key) { if (value.search(pollutionCategory) !== -1 && pollutionCategory) { var processingPattern = getProcessingPattern(value); $scope.processingPatterns[key] = processingPattern; } }); }); $scope.$watch('selectRow.toBeEdit.ProcessingPattern', function () { var toBeEdit = $scope.selectRow.toBeEdit; angular.forEach(options, function (value, key) { if (value.search(toBeEdit.PollutionCategory) !== -1 && value.search(toBeEdit.ProcessingPattern) !== -1 && toBeEdit.PollutionCategory && toBeEdit.ProcessingPattern) { toBeEdit.ParameterID = key; } }); }); /** * Get substring "pollutionCategory" from a string * @param String * @returns String */ function getPollutionCategory(value) { return angular.isString(value) ? value.slice(0, value.indexOf(',')) : null; } /** * Get substring "processingPattern" from a string * @param String * @returns String */ function getProcessingPattern(value) { return angular.isString(value) ? value.slice(value.indexOf(',') + 1, value.length) : null; } /** * Remove identical element from the array * @parem Array * @returns Array */ function filterDuplicatedData(array) { var filteredArray = []; angular.forEach(array, function (value) { if ($.inArray(value, filteredArray) === -1) { filteredArray.push(value); } }); return filteredArray; } function calcTotalKgCO2e() { $scope.summary = Enumerable.From($scope.model).Where('$.Type == 0').GroupBy("$.PollutionCategory", "$.KgCO2e", function (key, group) { return { PollutionCategory: key, totalKgCO2e: Enumerable.From(group).Sum(), AllocationKgCO2e: Enumerable.From(group).Sum() * $scope.Ratio }; }).ToArray(); var sumKgCO2e = 0; angular.forEach($scope.summary, function (item) { sumKgCO2e += item.totalKgCO2e; }); //console.log($scope.model); //console.log($scope.summary); $scope.sumKgCO2e = sumKgCO2e; } $scope.onAllocationChange = function (Allocation) { $scope.Allocation = Allocation if ($scope.Allocation == 0) //重量分配 //$scope.Ratio = $scope.calculate($scope.lcaDetail.ProductProductionPcs, $scope.product.Weight, $scope.lcaDetail.FabProductionWeight); $scope.Ratio = $scope.calculate($scope.lcaDetail.ProductProductionPcs * $scope.product.Weight / $scope.lcaDetail.FabProductionWeight, 1, $scope.lcaDetail.ProductProductionPcs); else if ($scope.Allocation == 1) //面積分配 //$scope.Ratio = $scope.calculate($scope.lcaDetail.ProductProductionPcs, $scope.product.AreaSize, $scope.lcaDetail.FabProductionArea); $scope.Ratio = $scope.calculate($scope.lcaDetail.ProductProductionPcs * $scope.product.AreaSize / $scope.lcaDetail.FabProductionArea, 1, $scope.lcaDetail.ProductProductionPcs); else if ($scope.Allocation == 2) //產量分配 //$scope.Ratio = $scope.calculate($scope.lcaDetail.ProductProductionPcs, 1, $scope.lcaDetail.FabProductionPcs); $scope.Ratio = $scope.calculate($scope.lcaDetail.ProductProductionPcs, 1, $scope.lcaDetail.FabProductionPcs); else if ($scope.Allocation == 3) //經濟分配 //$scope.Ratio = $scope.calculate($scope.lcaDetail.ProductProductionPcs, $scope.lcaDetail.ProductProductionEconomic, $scope.lcaDetail.FabProductionEconomic); $scope.Ratio = $scope.calculate($scope.lcaDetail.ProductProductionPcs * $scope.lcaDetail.ProductProductionEconomic / $scope.lcaDetail.FabProductionEconomic, 1, $scope.lcaDetail.ProductProductionPcs); else if ($scope.Allocation == 4) //工時分配 //$scope.Ratio = $scope.calculate($scope.lcaDetail.ProductProductionPcs, $scope.lcaDetail.ProductProductionHour, $scope.lcaDetail.FabProductionHour); $scope.Ratio = $scope.calculate($scope.lcaDetail.ProductProductionPcs * $scope.lcaDetail.ProductProductionHour / $scope.lcaDetail.FabProductionHour, 1, $scope.lcaDetail.ProductProductionPcs); else if ($scope.Allocation == 99) $scope.Ratio = 1; $http.post($scope.baseUrl+'/api/LCA/SaveAllocation/' + $routeParams.LCAID + '/' + $routeParams.DetailType + '/' + $scope.Allocation) .success(function (data) { calcTotalKgCO2e(); $scope.modifyCacheAllocation(); }) } } ]);