demo20230512/Browser_Local/js/LCA/DetailSurveyForm/LCAWasteController.js
2023-05-12 10:20:28 +08:00

630 lines
29 KiB
JavaScript

/**
* Views/Partial/LCA/Waste.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('LCAWasteCtrl', ['$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.createProcess = function () {
// Create an object & select it
var toBeCreated = {};
toBeCreated.ID = 0;
toBeCreated.LCAID = $routeParams.LCAID;
// Set waste type (other)
toBeCreated.Type = 1;
// 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 () {
// Calculate KgCO2e
JoinService.joinAsync([toBeCreated]).then(function () {
if (toBeCreated.Unit == undefined) {
confirm('無法判斷該係數單位');
}
else if (toBeCreated.Unit.indexOf('公斤') > -1 || toBeCreated.Unit.indexOf('kg') > -1) { }
else if (toBeCreated.Unit.indexOf('公噸') > -1 || toBeCreated.Unit.indexOf('mt') > -1) {
toBeCreated.Unit = '公斤(kg)';
toBeCreated.ParameterValue = toBeCreated.ParameterValue / 1000;
}
else {
confirm('無法判斷\'' + toBeCreated.Unit + '\'該單位');
}
// Update KgCO2e property
setKgCO2e([toBeCreated]);
$http.post($scope.baseUrl+'/api/Waste/Save/' + toBeCreated.LCAID + '/' + toBeCreated.ID, toBeCreated)
.success(function (data) {
// Join WasteCategory and ProcessingPattern data into model
data.WasteCategory = getWasteCategory(options[toBeCreated.ParameterID]);
data.ProcessingPattern = getProcessingPattern(options[toBeCreated.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, key) {
if (value.search(toBeEdit.WasteCategory) !== -1 && toBeEdit.WasteCategory) {
var processingPattern = getProcessingPattern(value);
$scope.processingPatterns[key] = processingPattern;
}
});
$scope.processingPatterns = filterDuplicatedData($scope.processingPatterns);
$scope.modalFormOption.show = true;
$scope.dataQualityOption = {};
$scope.dataQualityOption.data = {};
$scope.isEdit = true;
$scope.save = function () {
JoinService.joinAsync([toBeEdit]).then(function () {
if (toBeEdit.Unit == undefined) {
confirm('無法判斷該係數單位');
}
else if (toBeEdit.Unit.indexOf('公斤') > -1 || toBeEdit.Unit.indexOf('kg') > -1) { }
else if(toBeEdit.Unit.indexOf('公噸') > -1 || toBeEdit.Unit.indexOf('mt') > -1) {
toBeEdit.Unit = '公斤(kg)';
toBeEdit.ParameterValue = toBeEdit.ParameterValue / 1000;
}
else {
confirm('無法判斷\'' + toBeEdit.Unit + '\'該係數單位');
}
// Update KgCO2e property
setKgCO2e([toBeEdit]);
//toBeEdit.KgCO2e = toBeEdit.Scalar * toBeEdit.ParameterValue;
$http.post($scope.baseUrl+'/api/Waste/Save/' + toBeEdit.LCAID + '/' + toBeEdit.ID, toBeEdit)
.success(function (data) {
// Update waste data
toBeEdit.WasteCategory = getWasteCategory(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.deleteProcess = function (selected) {
var isConfirm = confirm(resource.DeleteItemMsg);
if (isConfirm) {
$http.delete($scope.baseUrl+'/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 (error) {
console.log(error);
});
}
};
$scope.selectSimaproProcess = function (selected, isOutside = true) {
$scope.simaproOption = {};
$scope.simaproOption.show = true;
$scope.simaproOption.filter = 1; // SimaproOption.Waste 廢棄物
$scope.simaproOption.onOk = function (selectedParameter, selectedCategory) {
console.log('simaproOption.onOk', selectedParameter, selectedCategory);
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;
}
/* 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 {
var ProcessType;
var ProcessTypeName = data[1];
if (ProcessTypeName == resource['Incineration']) {
ProcessType = 0;
} else if (ProcessTypeName == resource['Burial']) {
ProcessType = 1;
} else if (ProcessTypeName == resource['Recycling']) {
ProcessType = 2;
}
// get DQIID by DQIName
var DQIID;
var DQIName = data[7];
if (DQIName == resource['MetaDataDQI1']) {
DQIID = 0;
} else if (DQIName == resource['MetaDataDQI2']) {
DQIID = 1;
} else if (DQIName == resource['MetaDataDQI3']) {
DQIID = 2;
}
var model = {
Name: data[0],
ProcessType: ProcessType,
Scalar: parseFloat(data[2]) ? data[2] : 0,
ParameterValue: parseFloat(data[3]) ? data[3] : 0,
Unit: data[4],
ParameterDescription: data[5],
ParameterSource: data[6],
DQI: DQIID,
Description: data[7],
Type: 1, // 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 (model.Name === '' || model.Name === undefined) {
throw resource['WasteName'] + resource['RequiredMessage'];
}
if (model.Scalar === '' || model.Scalar === undefined) {
throw resource['WasteOtherScalar'] + resource['RequiredMessage'];
}
if (model.ParameterValue === '' || model.ParameterValue === undefined) {
throw resource['Parameter'] + resource['RequiredMessage'];
}
// if find incorrect DQI
if (model.ProcessType === undefined) {
throw resource['MataDataDQI'] + resource['ErrorText'] + '\'' + resource['MetaDataDQI1'] + '\',\'' + resource['MetaDataDQI2'] + '\',\'' + resource['MetaDataDQI3'] + '\'';
}
// if find incorrect DQI
if (model.DQI === undefined) {
throw resource['ProcessType'] + resource['ErrorText'] + '\'' + resource['Incineration'] + '\',\'' + resource['Burial'] + '\',\'' + resource['Recycling'] + '\'';
}
// if find incorrect ParameterID
//if (model.ParameterID === undefined) {
// throw resource['WasteCategory'] + '/' + resource['ProcessingPatterns'] + ' Error';
//}
return model;
}
catch (err) {
return { error: err };
}
},
export: function (list, exportType = 'txt') {
if (exportType == 'csv') {
var data = [];
// header
data.push([
resource['WasteName'],
resource['ProcessType'],
resource['WasteOtherScalar'],
resource['Parameter'],
resource['ParameterUnit'],
resource['ParaDesc'],
resource['Parameter'] + resource['Source'],
resource['MataDataDQI'],
resource['Notes']
]);
// body
angular.forEach(list, function (entry) {
var csv = [];
//column 1
csv.push(entry.Name);
//column 2
if (entry.ProcessType == 0) {
csv.push(resource['Incineration']);
} else if (entry.ProcessType == 1) {
csv.push(resource['Burial']);
} else if (entry.ProcessType == 2) {
csv.push(resource['Recycling']);
}
//column 3
csv.push(entry.Scalar);
//column 4
csv.push(entry.ParameterValue);
//column 5
csv.push(entry.Unit);
//column 6
csv.push(entry.ParameterDescription);
//column 7
csv.push(entry.ParameterSource);
//column 8
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 9
csv.push(entry.Description);
data.push(csv);
});
ExportCsvService.startExport(data, "Export_Waste.csv");
}
else {
var csv = '\uFEFF';
var link;
var delimeter = '\t';
// header
csv += resource['WasteCategory'] + delimeter
+ resource['ProcessingPatterns'] + delimeter
+ resource['WasteOtherScalar'] + delimeter
+ resource['MataDataDQI'] + delimeter
+ resource['DQIDescription'] + delimeter
+ resource['Notes'];
// body
angular.forEach(list, function (entry) {
csv += '\r\n';
//column 1
csv += entry.WasteCategory + delimeter;
//column 2
csv += entry.ProcessingPattern + delimeter;
//column 2
csv += entry.Scalar + delimeter;
//column 3
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 4
csv += entry.DQIDescription + delimeter;
//column 5
csv += entry.Description;
});
var filename = "Export_Waste.txt";
require([baseUrl+'/Scripts/FileSaver.js'],
function requrieSuccess(SaveAs) {
var textFileAsBlob = new Blob([csv], { type: 'text;charset=utf-8,' });
saveAs(textFileAsBlob, "Export_Waste.txt")
},
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 == 1));
})
return deferred.promise;
},
saveAsyncFn: batchCreateAndUpdateCache
};
$scope.quoteModal = {
show: false
};
// Get data and prepare $scope.model
getAllDataAsync($routeParams.LCAID)
.then(function (response) {
options = response.OptionsTwo;
var sheetHeader = response.SheetHeader ? response.SheetHeader : {};
if (response.Wastes) {
$scope.model = response.Wastes.filter(x => x.Type == 1);
}
// Get each model's CasteCategory and ProcessingPattern by "ParameterID"
angular.forEach($scope.model, function (model) {
model.WasteCategory = getWasteCategory(options[model.ParameterID]);
model.ProcessingPattern = getProcessingPattern(options[model.ParameterID]);
});
// Sources of dropdown list
$scope.wasteCategories = [];
angular.forEach(options, function (value) {
var wasteCategory = getWasteCategory(value);
$scope.wasteCategories.push(wasteCategory);
});
calcTotalKgCO2e();
// Duplicated wasteCategories
$scope.wasteCategories = filterDuplicatedData($scope.wasteCategories);
// $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;
// Update waste data
angular.forEach(data.result, function (model) {
model.WasteCategory = getWasteCategory(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) {
//console.log('setKgCO2e',entry);
// Join parameter value and calculate KgCO2e
if (entry.ParameterValue && entry.Scalar) {
entry.KgCO2e = entry.ParameterValue * entry.Scalar;
}
else
entry.KgCO2e = 0;
});
}
/* 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.WasteCategory', function (wasteCategory) {
// If wasteCategory is changed then reset processingPatterns
$scope.processingPatterns = [];
angular.forEach(options, function (value, key) {
if (value.search(wasteCategory) !== -1 && wasteCategory) {
var processingPattern = getProcessingPattern(value);
$scope.processingPatterns[key] = processingPattern;
}
});
});
// Update model parameter id
$scope.$watch('selectRow.toBeEdit.ProcessingPattern', function () {
var toBeEdit = $scope.selectRow.toBeEdit;
angular.forEach(options, function (value, key) {
if (value.search(toBeEdit.WasteCategory) !== -1 &&
value.search(toBeEdit.ProcessingPattern) !== -1 &&
toBeEdit.WasteCategory && toBeEdit.ProcessingPattern) {
toBeEdit.ParameterID = key;
}
});
});
/**
* Get substring "wasteCategory" from a string
* @param String
* @returns String
*/
function getWasteCategory(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 == 1').GroupBy("$.Name", "$.KgCO2e", function (key, group) {
return { Name: 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;
});
$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();
})
}
}]);