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

473 lines
25 KiB
JavaScript

/*
** Views/Partial/LCA/DirectMaterial.cshtml
** Views/Partial/LCA/InDirectMaterial.cshtml
** Views/Partial/LCA/WrapMaterial.cshtml are using this controller
** this controller is responsible to provide data , function , in the view
*/
angular.module('CarbonFootprint')
.controller('LCAMaterialController',
['$q', '$scope', '$routeParams', '$filter', '$http', 'LCADetailCacheService', 'MaterialFactory', 'MultiLanguageService',
function ($q, $scope, $routeParams, $filter, $http, LCADetailCacheService, MaterialFactory, MultiLanguageService) {
var resource;
// 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;
}
MultiLanguageService.getResourceAsync()
.then(function (response) {
resource = response;
}, function (error) {
console.log(error);
});
$scope.model = {};
$scope.modalFormOption = {};
$scope.fileImportOption = {};
$scope.quoteOption = {};
$q.all([LCADetailCacheService.getAllMaterialAsync($routeParams.LCAID),
$http.get($scope.baseUrl+'/api/Parameter/GetSimaproCategories'),
$http.get($scope.baseUrl+'/api/' + $routeParams.DetailType + '/GetSheetHeader/' + $routeParams.LCAID)])
.then(function (result) {
// Fetch data
var cached = result[0];
var directMaterials = $scope.model.directMaterials = $filter('filter')(cached, { MaterialType: 0, IncludedInInterrogation: true });
var indirectMaterials = $scope.model.indirectMaterials = $filter('filter')(cached, { MaterialType: 1 });
var wrapMaterials = $scope.model.wrapMaterials = $filter('filter')(cached, { MaterialType: 2 });
$scope.calcTotalKgCO2e();
var materialTypeOptions = $scope.model.materialTypeOptions = result[1].data;
var sheetHeader = result[2].data.SheetHeader ? result[2].data.SheetHeader : {};
// $scope.sheetHeader is parent's object
$scope.sheetHeader.SheetFillerName = sheetHeader.SheetFillerName;
$scope.sheetHeader.Phone = sheetHeader.Phone;
$scope.sheetHeader.Department = sheetHeader.Department;
// Provide function
$scope.displayDetail = function (selected) {
var local = $scope.toBeEdit = angular.copy(selected);
$scope.modalFormOption.show = true
$scope.dataQualityOption = {};
$scope.dataQualityOption.data = {};
$scope.isEdit = true;
};
$scope.createChildProcess = function (selected) {
var toBeCreated = {};
if (selected.isChild) return // do nothing, if the selected is child
toBeCreated.ID = 0;
toBeCreated.ParentMaterialID = selected.ID;
toBeCreated.LCAID = selected.LCAID
toBeCreated.parentName = selected.Name;
toBeCreated.MaterialType = selected.MaterialType;
toBeCreated.isChild = true;
$scope.toBeEdit = toBeCreated;
$scope.modalFormOption.show = true;
$scope.modalFormOption.onOkFn = function () {
LCADetailCacheService.updateMaterialsAsync([toBeCreated]).then(function (result) {
selected.ChildMaterials.unshift(result[0]);
$scope.modalFormOption.show = false;
$scope.calcTotalKgCO2e();
});
};
};
$scope.createProcess = function (materialType) {
// New an object & select it
var toBeCreated = {};
if (materialType !== 1 && materialType !== 2) {
throw 'exception';
}
toBeCreated.ID = 0;
toBeCreated.MaterialType = materialType;
toBeCreated.LCAID = $routeParams.LCAID;
toBeCreated.MaterialComposites = [];
toBeCreated.WeightUnit = 'kg';
toBeCreated.VolumeUnit = 'm3';
$scope.toBeEdit = toBeCreated;
$scope.modalFormOption.show = true;
$scope.modalFormOption.onOkFn = function () {
LCADetailCacheService.updateMaterialsAsync([toBeCreated]).then(function (result) {
var updateArray = materialType == 1 ? indirectMaterials : wrapMaterials;
updateArray.unshift(result[0]);
cached.unshift(result[0]);
$scope.modalFormOption.show = false;
$scope.calcTotalKgCO2e();
});
};
$scope.dataQualityOption = {};
$scope.dataQualityOption.data = {};
$scope.isEdit = false;
};
$scope.export = MaterialFactory.export;
$scope.importChild = function (selectedParent) {
if (selectedParent.isChild) throw "exception";
$scope.fileImportOption.show = true;
$scope.fileImportOption.modelBuilder = MaterialFactory,
$scope.fileImportOption.saveAsync = function (parsedList) {
var deferred = $q.defer();
if (parsedList && parsedList.length > 0) {
angular.forEach(parsedList, function (entry) {
entry.ID = 0;
entry.ParentMaterialID = selectedParent.ID;
entry.MaterialType = selectedParent.MaterialType;
});
LCADetailCacheService.updateMaterialsAsync(parsedList).then(function (result) {
angular.forEach(result, function (entry) {
selectedParent.ChildMaterials.push(entry)
});
deferred.resolve(null);
$scope.calcTotalKgCO2e();
});
}
return deferred.promise;
};
};
$scope.importProcess = function (materialType) {
if (materialType !== 1 && materialType !== 2) {
throw 'exception'
}
$scope.fileImportOption.show = true;
$scope.fileImportOption.modelBuilder = MaterialFactory;
$scope.fileImportOption.saveAsync = function (parsedList) {
var deferred = $q.defer();
if (parsedList && parsedList.length > 0) {
angular.forEach(parsedList, function (entry) {
entry.ID = 0;
entry.MaterialType = materialType;
});
LCADetailCacheService.updateMaterialsAsync(parsedList).then(function (result) {
var updateArray = materialType == 1 ? indirectMaterials : wrapMaterials;
angular.forEach(result, function (entry) {
updateArray.push(entry);
cached.push(entry);
});
deferred.resolve(null);
$scope.calcTotalKgCO2e();
});
}
return deferred.promise;
};
};
$scope.quoteProcess = function (materialType) {
if (materialType !== 1 && materialType !== 2) {
throw 'exception'
}
$scope.quoteOption.show = true;
$scope.quoteOption.queryDataAsyncFn = function (LCAID) {
var deferred = $q.defer();
LCADetailCacheService.getAllMaterialAsync(LCAID).then(function (result) {
var filtered = $filter('filter')(result, { MaterialType: materialType })
deferred.resolve(filtered);
$scope.calcTotalKgCO2e();
});
return deferred.promise;
}
$scope.quoteOption.saveAsyncFn = function (parsedList) {
var deferred = $q.defer();
if (parsedList && parsedList.length > 0) {
LCADetailCacheService.updateMaterialsAsync(parsedList).then(function (result) {
var updateArray = materialType == 1 ? indirectMaterials : wrapMaterials;
angular.forEach(result, function (entry) {
updateArray.push(entry);
cached.push(entry);
});
deferred.resolve(null);
$scope.calcTotalKgCO2e();
});
}
$scope.calcTotalKgCO2e();
return deferred.promise;
};
}
$scope.editChildProcess = function (selected, parent) {
var local = $scope.toBeEdit = angular.copy(selected);
var localParent = angular.copy(parent);
local.parentName = localParent.Name;
$scope.modalFormOption.show = true;
$scope.modalFormOption.onOkFn = function () {
if (selected.localDisplayParameterValue && local.Scalar && local.Quantity) {
local.KgCO2e = selected.localDisplayParameterValue * local.Scalar * local.Quantity;
}
/**
* Landmine here!
* Use updateMaterialsAsync to update materials will lead all child materials become null in the parent material
* So we copy into cloneChildMaterials
*/
var cloneChildMaterials = parent.ChildMaterials;
// Update cloneChildMaterials with local material
angular.forEach(cloneChildMaterials, function (childMaterial, key) {
if (childMaterial.ID == local.ID) {
cloneChildMaterials[key] = local;
}
});
// Assign updated child material that calculate parent total KgCO2 with child materials
localParent.ChildMaterials = cloneChildMaterials;
localParent.KgCO2e = calculateParentKgCO2e(localParent);
// Post data to api
LCADetailCacheService.updateMaterialsAsync([local, localParent])
.then(function (result) {
angular.copy(local, selected);
angular.copy(localParent, parent);
// child materials is null after post data, re-assign cloneChildMaterials in to parent material
parent.ChildMaterials = cloneChildMaterials;
$scope.modalFormOption.show = false;
$scope.calcTotalKgCO2e();
});
};
};
$scope.editProcess = function (selected) {
var local = $scope.toBeEdit = angular.copy(selected);
if ($scope.toBeEdit.WeightUnit == undefined || $scope.toBeEdit.WeightUnit == '')
$scope.toBeEdit.WeightUnit = 'kg';
if ($scope.toBeEdit.VolumeUnit == undefined || $scope.toBeEdit.VolumeUnit == '')
$scope.toBeEdit.VolumeUnit = 'm3';
$scope.modalFormOption.show = true;
$scope.modalFormOption.onOkFn = function () {
if (selected.localDisplayParameterValue && local.Scalar && local.Quantity) {
local.KgCO2e = selected.localDisplayParameterValue * local.Scalar * local.Quantity;
}
LCADetailCacheService.updateMaterialsAsync([local]).then(function (result) {
angular.copy(local, selected);
$scope.modalFormOption.show = false;
$scope.calcTotalKgCO2e();
});
};
$scope.dataQualityOption = {};
$scope.dataQualityOption.data = {};
$scope.isEdit = true;
};
$scope.dataQualityShow = function (selected) {
$http.get($scope.baseUrl+'/api/DataQualityLevel/GetByTableId/ProductLCAProductSurveyForm_Materials/' + selected.ID
).success(function (data) {
angular.copy(data, $scope.dataQualityOption.data);
$scope.dataQualityOption.data.Name = selected.Name;
$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;
$scope.calcTotalKgCO2e();
}).error(function (data, status) {
alert(data.ExceptionMessage);
});
};
$scope.deleteProcess = function (selected) {
var isConfirm = confirm(resource.DeleteItemMsg);
if (isConfirm) {
$http.delete($scope.baseUrl+'/api/Material/DeleteMaterial/' + selected.LCAID + '/' + selected.ID)
.success(function () {
var index;
if (selected.MaterialType === 0) {
index = $scope.model.directMaterials.indexOf(selected);
$scope.model.directMaterials.splice(index, 1);
} else if (selected.MaterialType === 1) {
index = $scope.model.indirectMaterials.indexOf(selected);
$scope.model.indirectMaterials.splice(index, 1);
} else if (selected.MaterialType === 2) {
index = $scope.model.wrapMaterials.indexOf(selected);
$scope.model.wrapMaterials.splice(index, 1);
}
index = cached.indexOf(selected);
cached.splice(index, 1);
// This operate is base on selectRow directive in TableEdit.js file
$scope.selectRow.unSelect();
$scope.calcTotalKgCO2e();
});
}
};
// Refactor this function if possible , 選擇simapro係數包含了1.直接材料子項 or 2.選擇間接/包材(無子項)
$scope.selectSimaproProcess = function (selectedMaterial, parent, isOutside = true) {
$scope.simaproOption = {};
$scope.simaproOption.show = true;
$scope.simaproOption.filter = 37; // SimaproOption.Material 原料
$scope.simaproOption.onOk = function (selectedParameter, selectedCategory) {
selectedMaterial.ParameterValue = selectedParameter.Value;
selectedMaterial.ParameterID = selectedParameter.ID;
selectedMaterial.ParameterTypeID = selectedCategory.ID;
selectedMaterial.ParameterValue = selectedParameter.Value;
selectedMaterial.ParameterDescription =
selectedParameter.DisplayNameTW + ': ' + selectedParameter.Remark;
selectedMaterial.KgCO2e = selectedParameter.Value * selectedMaterial.Scalar * selectedMaterial.Quantity;
selectedMaterial.Unit = selectedParameter.Unit;
selectedMaterial.localDisplayParameterValue = selectedParameter.Value;
selectedMaterial.ParaSourceDesc = selectedParameter.Description;
selectedMaterial.MaterialComposites = [];
$scope.updateKgCO2e(selectedMaterial);
if (isOutside) {
if (parent) {
parent.KgCO2e = calculateParentKgCO2e(parent);
LCADetailCacheService.updateMaterialsAsync([selectedMaterial, parent])
} else {
LCADetailCacheService.updateMaterialsAsync([selectedMaterial])
}
}
};
};
$scope.selectSimaproProcess_Composition = function (selectedComposition) {
$scope.simaproOption = {};
$scope.simaproOption.show = true;
$scope.simaproOption.filter = 37; // SimaproOption.Material 原料
$scope.simaproOption.onOk = function (selectedParameter, selectedCategory) {
selectedComposition.parameterValue = selectedParameter.Value;
selectedComposition.parameterDescription =
selectedParameter.DisplayNameTW + ': ' + selectedParameter.Remark;
selectedComposition.parameterUnit = selectedParameter.Unit;
$scope.updateKgCO2e($scope.toBeEdit);
//LCADetailCacheService.updateMaterialsAsync([selectedMaterial]);
}
};
$scope.reNumber = function (materialType) {
$http.post(baseUrl + '/api/Material/ReNumber/' + $routeParams.LCAID + '/' + materialType).success(function (data) {
console.log('reNumber', data);
location.reload(true);
}).error(function (data) {
console.log('error', data);
})
};
});
// 新增材質組成項目
$scope.addComposite = function () {
if ($scope.toBeEdit.MaterialComposites.length == 0) {
$scope.toBeEdit.ParameterDescription = '';
$scope.toBeEdit.Unit = '';
}
$scope.toBeEdit.MaterialComposites.push({ materialComposite: '', CASNo: '', compositePercentage: '', parameterValue: '', parameterUnit: '', parameterDescription: '' })
$scope.updateParameter();
}
$scope.deleteComposite = function (index) {
$scope.toBeEdit.MaterialComposites.splice(index, 1)
$scope.updateParameter();
}
$scope.updateScalar = function (num, mul) {
$scope.updateDensity()
$scope.updateActivityIntensity();
}
$scope.updateActivityIntensity = function () {
var weiMul = 1;
if ($scope.toBeEdit.WeightUnit == 'mg')
weiMul = 0.000001;
else if ($scope.toBeEdit.WeightUnit == 'g')
weiMul = 0.001;
else if ($scope.toBeEdit.WeightUnit == 't')
weiMul = 1000;
$scope.toBeEdit.ActivityIntensity_BOM = $scope.toBeEdit.Scalar * weiMul * $scope.toBeEdit.Quantity_BOM;
$scope.toBeEdit.ActivityIntensity = $scope.toBeEdit.Scalar * weiMul * $scope.toBeEdit.Quantity;
//$scope.toBeEdit.oriKgCO2e = $scope.toBeEdit.KgCO2e;
$scope.updateKgCO2e($scope.toBeEdit);
}
$scope.updateKgCO2e = function (selectedMaterial) {
selectedMaterial.KgCO2e = selectedMaterial.ActivityIntensity * selectedMaterial.ParameterValue;
selectedMaterial.KgCO2e_BOM = selectedMaterial.KgCO2e;
}
$scope.updateParameter = function () {
var total = 0;
$scope.toBeEdit.MaterialComposites.forEach(
m => total += m.parameterValue * m.compositePercentage / 100
);
$scope.toBeEdit.ParameterValue = total;
$scope.updateKgCO2e($scope.toBeEdit);
}
$scope.updateDensity = function () {
var volMul = 1;
if ($scope.toBeEdit.VolumeUnit == 'ml')
volMul = 0.000001;
else if ($scope.toBeEdit.VolumeUnit == 'L')
volMul = 0.001;
var weiMul = 1;
if ($scope.toBeEdit.WeightUnit == 'mg')
weiMul = 0.000001;
else if ($scope.toBeEdit.WeightUnit == 'g')
weiMul = 0.001;
else if ($scope.toBeEdit.WeightUnit == 't')
weiMul = 1000;
$scope.toBeEdit.Density = $scope.toBeEdit.Scalar * weiMul / ($scope.toBeEdit.Volume * volMul);
}
var calculateParentKgCO2e = function (material) {
var parentKgCO2e = 0;
if (material.isChild) return material.KgCO2e;
angular.forEach(material.ChildMaterials, function (childMaterial) {
parentKgCO2e += childMaterial.KgCO2e;
});
return parentKgCO2e;
};
$scope.calcTotalKgCO2e = function () {
$scope.wrapMaterialsSumKgCO2e = 0;
$scope.indirectMaterialsSumKgCO2e = 0;
$scope.directMaterialsSumKgCO2e = 0;
angular.forEach($scope.model.wrapMaterials, function (model) {
$scope.wrapMaterialsSumKgCO2e += model.KgCO2e
});
angular.forEach($scope.model.indirectMaterials, function (model) {
$scope.indirectMaterialsSumKgCO2e += model.KgCO2e
});
angular.forEach($scope.model.directMaterials, function (model) {
$scope.directMaterialsSumKgCO2e += model.KgCO2e
});
}
}
]);