using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Web; using Weee.DAL; using Weee.Models; using Weee.Models.Paramemter; using Weee.ViewModels.DataTransferObject; namespace Weee.Service { public class LifecycleAssmtDataService : WeeeLCADataService { public LifecycleAssmtDataService(WeeeDataContext db) : base(db) { } /// /// 將用電量同步到風險評估的C2,C4生命週期項目 /// /// /// /// public string power2lifeCycle(string userID, int LCAID, decimal Scalar, string curArea , int curYear, Weee.Models.Paramemter.Parameter para) { string ret = ""; //同步到風險評估的C2電力項目 var qry2 = (from a in _db.LCARiskAssmtSurveyForm_LifecycleAssmts where a.LCAID == LCAID && a.LifeCycleStage == 3 && a.category == "2" && a.GHGinventoryItemNo == "2.1" select a); if (qry2.Any())//有資料則修改 { foreach (var rec in qry2.ToList()) { rec.ActivityIntensity = Scalar; rec.KgCO2e = para.CO2Value > 0 ? para.CO2Value : para.Value; rec.EmissionKg = rec.ActivityIntensity * rec.KgCO2e; rec.EmissionT = rec.EmissionKg / 1000; } } else//無資料則新增 { LCARiskAssmtSurveyForm_LifecycleAssmt rec = new LCARiskAssmtSurveyForm_LifecycleAssmt(); rec.LCAID = LCAID; rec.Unit = "用電度";//from para rec.CreatedBy = userID; rec.CreatedDate = DateTime.Now; rec.LifeCycleStage = 3; //rec.Instruction = ""; from para rec.GHGEvaluateItem = "輸入電力"; rec.category = "2"; rec.categorySubItem = "輸入電力"; rec.GHGinventoryItemNo = "2.1"; rec.ActivityIntensity = Scalar; rec.KgCO2e = para.CO2Value > 0 ? para.CO2Value : para.Value; rec.EmissionKg = rec.ActivityIntensity * rec.KgCO2e; rec.EmissionT = rec.EmissionKg / 1000; _db.LCARiskAssmtSurveyForm_LifecycleAssmts.Add(rec); } //同步到風險評估的C4電力上游採購 Weee.Models.Paramemter.Parameter paraC4 = getC4coeff(curArea, curYear); var qry4 = (from a in _db.LCARiskAssmtSurveyForm_LifecycleAssmts where a.LCAID == LCAID && a.LifeCycleStage == 3 && a.category == "4" && a.GHGinventoryItemNo == "4.1b" select a); if (qry4.Any())//有資料則修改 { foreach (var rec in qry4.ToList()) { rec.ActivityIntensity = Scalar; rec.KgCO2e = paraC4==null ? 0 : paraC4.CO2Value; rec.EmissionKg = rec.ActivityIntensity * rec.KgCO2e; rec.EmissionT = rec.EmissionKg / 1000; } } else//無資料則新增 { LCARiskAssmtSurveyForm_LifecycleAssmt rec = new LCARiskAssmtSurveyForm_LifecycleAssmt(); rec.LCAID = LCAID; rec.Unit = "用電度";//from paraC4 rec.CreatedBy = userID; rec.CreatedDate= DateTime.Now; rec.LifeCycleStage = 3; //rec.Instruction = ""; from paraC4 rec.GHGEvaluateItem = "輸入電力上游"; rec.category = "4"; rec.categorySubItem = "輸入電力上游"; rec.GHGinventoryItemNo = "4.1b"; rec.ActivityIntensity = Scalar; rec.KgCO2e = paraC4==null ? 0 : paraC4.CO2Value; rec.EmissionKg = rec.ActivityIntensity * rec.KgCO2e; rec.EmissionT = rec.EmissionKg / 1000; _db.LCARiskAssmtSurveyForm_LifecycleAssmts.Add(rec); } _db.SaveChanges(); //最後還要更新風險評估資料的逐項百分比 UpdatePercentage(LCAID); _db.SaveChanges(); return ret; } private Weee.Models.Paramemter.Parameter getC4coeff(string curArea , int curYear) { Weee.Models.Paramemter.Parameter ret = null; var qry = (from p in _db.Parameters join yp in _db.YearlyParameters on p.ID equals yp.ID join t in _db.YearlyParameterTypes on yp.TypeID equals t.ID join c in _db.YearlyParameterCategories on t.CategoryID equals c.ID where yp.Year==curYear && yp.IsHistory==false && c.Category==Categories.Electric && t.DisplayNameTW=="用電量上游排放" select p).FirstOrDefault(); if (qry!=null) ret = qry; return ret; } public IQueryable GetList(int LCAID) { if (!AuthorizedLCAs.Contains(LCAID)) throw new Exception("not authorized"); return _db.Set().Where(x => x.LCAID == LCAID) .OrderByDescending(x => x.ID); } public IEnumerable GetItems() { return _db.Set() .ToList() .Select(x => new LifecycleAssmtItemDto() { ID = x.ID, LifeCycleStage = x.LifeCycleStage, DisplayName = x.DisplayName }); } public IEnumerable Sync(int LCAID, UpdateLIfecycleAssmtDTO input) { // 生命週期階段的大update var oldLifecycleAssmtDataData = _db.Set().Where(x => x.LCAID == LCAID).ToList(); var newLifecycleAssmtData = new List(); if (input.Material) newLifecycleAssmtData.AddRange( UpdateMaterial(oldLifecycleAssmtDataData.Where(x => x.LifeCycleStage == 1) , LCAID, input.MaterialDelete)); if (input.UpstreamDelivery) newLifecycleAssmtData.AddRange( UpdateUpstreamDelivery(oldLifecycleAssmtDataData.Where(x => x.LifeCycleStage == 2) , LCAID, input.UpstreamDeliveryDelete)); if (input.Service) newLifecycleAssmtData.AddRange( UpdateService(oldLifecycleAssmtDataData.Where(x => x.LifeCycleStage == 3) , LCAID, input.ServiceDelete)); if (input.DownstreamDelivery) newLifecycleAssmtData.AddRange( UpdateDownstreamDelivery(oldLifecycleAssmtDataData.Where(x => x.LifeCycleStage == 4) , LCAID, input.DownstreamDeliveryDelete)); if (input.Product) newLifecycleAssmtData.AddRange( UpdateProduct(oldLifecycleAssmtDataData.Where(x => x.LifeCycleStage == 5) , LCAID, input.ProductDelete)); if (input.Waste) newLifecycleAssmtData.AddRange( UpdateWaste(oldLifecycleAssmtDataData.Where(x => x.LifeCycleStage == 6) , LCAID, input.WasteDelete)); UpdatePercentage(newLifecycleAssmtData); _db.SaveChanges(); return newLifecycleAssmtData; } private Dictionary GetYearlyParameterOptions(Categories cate) { var ret = _db.YearlyParameters .Include(x => x.Type) .Include(x => x.Area) .Where(x => x.Area.Category.Category == cate && x.IsHistory == false) .OrderBy(x => x.AreaID) .ThenBy(x => x.Year) .ToDictionary(x => x.ID, x => x.Area.DisplayName + "," + x.Type.DisplayName + "," + x.Year); return ret; } private void UpdatePercentage(IEnumerable lifecycleAssmtData) { var sumEmissionT = lifecycleAssmtData.Sum(x => x.EmissionT); foreach (var data in lifecycleAssmtData) { data.Percentage = sumEmissionT==0 ? 0 : Math.Round((data.EmissionT / sumEmissionT) * 100, 4); } } private void UpdatePercentage(int LCAID) { var qry = (from a in _db.LCARiskAssmtSurveyForm_LifecycleAssmts where a.LCAID == LCAID select a); if (qry.Any()) UpdatePercentage(qry.ToList()); } /// /// 更新原料取得资料 /// /// /// private IEnumerable UpdateMaterial( IEnumerable materialData , int LCAID, /*bool update,*/ bool delete) { var result = new List(); if (delete) { foreach (var data in materialData) { if (data.LCAID==LCAID) _db.Entry(data).State = EntityState.Deleted; } } else { result.AddRange(materialData); } //if (update) { var material = _db.Set().Where(x => x.LCAID == LCAID).ToList(); foreach (var item in material) { if (delete || !materialData.Any(x => x.GHGEvaluateItem == item.MaterialName)) { var materialAssmt = new LCARiskAssmtSurveyForm_LifecycleAssmt() { LCAID = LCAID, MaterialNo = item.MaterialNo, LifeCycleStage = 1, GHGEvaluateItem = item.MaterialName, ActivityIntensity = item.ActivityIntensity, KgCO2e = item.KgCO2e, Unit = item.Unit, EmissionKg = item.ActivityIntensity * item.KgCO2e, EmissionT = item.ActivityIntensity * item.KgCO2e / 1000, Instruction = item.Comment }; result.Add(materialAssmt); _db.Entry(materialAssmt).State = EntityState.Added; } } } return result; } /// /// 更新上游运输资料 /// /// /// private IEnumerable UpdateUpstreamDelivery( IEnumerable deliveryData , int LCAID, /*bool update,*/ bool delete) { var result = new List(); if (delete) { foreach (var data in deliveryData) { _db.Entry(data).State = EntityState.Deleted; } } else { result.AddRange(deliveryData); } //if (update) { var purchase = _db.Set().Where(x => x.LCAID == LCAID).ToList(); // 採購及運輸地址 var travel = _db.Set().Where(x => x.LCAID == LCAID).ToList(); // 商務旅行(國際) foreach (var item in purchase) { if (delete || !deliveryData.Any(x => x.GHGEvaluateItem == item.ElementName)) { var materialAssmt = new LCARiskAssmtSurveyForm_LifecycleAssmt() { LCAID = LCAID, LifeCycleStage = 2, MaterialNo=item.MaterialNo, GHGEvaluateItem = item.ElementName, ActivityIntensity = item.TKM, KgCO2e = 0.235m, Unit = "tkm", EmissionKg = item.TKM * 0.235m, EmissionT = item.TKM * 0.235m / 1000, Instruction= @"產品碳足跡計算服務平台營業用大貨車https://cfp-calculate.tw/cfpc/WebPage/WebSites/CoefficientDB.aspx" }; result.Add(materialAssmt); _db.Entry(materialAssmt).State = EntityState.Added; } } //// 商務旅行(國際) //var travelItems = new List(); //foreach (var item in travel) //{ // if (string.IsNullOrEmpty(item.AirportFrom) || string.IsNullOrEmpty(item.AirportTo)) // { // continue; // } // var airportFrom = TryAddTravelItem(item.AirportFrom, item.TransferStation1); // airportFrom = TryAddTravelItem(airportFrom, item.TransferStation2); // airportFrom = TryAddTravelItem(airportFrom, item.AirportTo); //} //foreach (var item in travelItems) //{ // var ghgEvaluateItem = $"商務旅行({item.From}-{item.To})"; // if (delete || !deliveryData.Any(x => x.GHGEvaluateItem == ghgEvaluateItem)) // { // var materialAssmt = new LCARiskAssmtSurveyForm_LifecycleAssmt() // { // LCAID = LCAID, // LifeCycleStage = 2, // GHGEvaluateItem = ghgEvaluateItem, // ActivityIntensity = item.Count, // KgCO2e = 0m, // Unit = "kgco2e", // EmissionKg = 0m, // EmissionT = 0m, // }; // result.Add(materialAssmt); // _db.Entry(materialAssmt).State = EntityState.Added; // } // else // { // var updateItem = deliveryData.FirstOrDefault(x => x.GHGEvaluateItem == ghgEvaluateItem && x.ActivityIntensity != item.Count); // if (updateItem != null) // { // updateItem.ActivityIntensity = item.Count; // updateItem.EmissionKg = item.Count * updateItem.KgCO2e; // updateItem.EmissionT = item.Count * updateItem.KgCO2e / 1000; // } // } //} //if (delete || !deliveryData.Any(x => x.GHGEvaluateItem == "員工通勤")) //{ // var employeeAssmt = new LCARiskAssmtSurveyForm_LifecycleAssmt() // { // LCAID = LCAID, // LifeCycleStage = 2, // GHGEvaluateItem = "員工通勤", // ActivityIntensity = 0, // KgCO2e = 0.0951m, // Unit = "延人公里(PKM)", // EmissionKg = 0m, // EmissionT = 0m, // }; // result.Add(employeeAssmt); // _db.Entry(employeeAssmt).State = EntityState.Added; //} //if (delete || !deliveryData.Any(x => x.GHGEvaluateItem == "客戶和訪客運輸造成之排放")) //{ // var customerAssmt = new LCARiskAssmtSurveyForm_LifecycleAssmt() // { // LCAID = LCAID, // LifeCycleStage = 2, // GHGEvaluateItem = "客戶和訪客運輸造成之排放", // ActivityIntensity = 0, // KgCO2e = 0.115m, // Unit = "延人公里(PKM)", // EmissionKg = 0m, // EmissionT = 0m, // }; // result.Add(customerAssmt); // _db.Entry(customerAssmt).State = EntityState.Added; //} //string TryAddTravelItem(string airportFrom, string airportTo) //{ // if (!string.IsNullOrEmpty(airportTo)) // { // var travelItem = travelItems.FirstOrDefault(x => x.From == airportFrom && x.To == airportTo); // if (travelItem != null) // { // travelItem.Count += 1; // } // else // { // travelItems.Add(new IntlTravel() { From = airportFrom, To = airportTo, Count = 1 }); // } // return airportTo; // } // return airportFrom; //} } return result; } /// /// 更新运作支援及服务资料 /// /// /// private IEnumerable UpdateService( IEnumerable serviceData , int LCAID, /*bool update,*/ bool delete) { var result = new List(); if (delete) { foreach (var data in serviceData) { _db.Entry(data).State = EntityState.Deleted; } } //else //{ // result.AddRange(serviceData); //} //if (update) { var vehicles = _db.Set().Where(x => x.LCAID == LCAID).ToList(); var powerUsages = _db.Set().Where(x => x.LCAID == LCAID).ToList(); var waterUsages = _db.Set().Where(x => x.LCAID == LCAID).ToList(); var options = GetYearlyParameterOptions(Categories.Vehicle); var vehicleItems = new List(); foreach (var item in vehicles) { if (!item.ParameterID.HasValue) { continue; } if (options.TryGetValue(item.ParameterID.Value, out string parameter)) { var fuelType = GetFuelType(parameter); var vehicleItem = vehicleItems.FirstOrDefault(x => x.FuelType == fuelType); if (vehicleItem != null) { vehicleItem.Scalar += item.Scalar; } else { vehicleItems.Add(new Vehicle() { FuelType = fuelType, Scalar = item.Scalar }); } } } foreach (var item in vehicleItems) { var ghgEvaluteItem = $"車輛用油上游能源採購({item.FuelType})"; if (delete || !serviceData.Any(x => x.GHGEvaluateItem == ghgEvaluteItem)) { var vehicleAssmt = new LCARiskAssmtSurveyForm_LifecycleAssmt() { LCAID = LCAID, LifeCycleStage = 3, GHGEvaluateItem = ghgEvaluteItem, ActivityIntensity = item.Scalar, KgCO2e = 0m, Unit = "L", EmissionKg = 0m, EmissionT = 0m, }; result.Add(vehicleAssmt); _db.Entry(vehicleAssmt).State = EntityState.Added; } } var sumPowerNormal = powerUsages.Where(x => x.Type == LCACommonSurveyForm_PowerUsages.PowerType.Normal).Sum(x => x.Scalar); var sumPowerGreen = powerUsages.Where(x => x.Type == LCACommonSurveyForm_PowerUsages.PowerType.GreenNoCarbon).Sum(x => x.Scalar); if (sumPowerNormal > 0) { var powerNormalGHGEvaluateItem1 = "電力上游能源採購(一般用電)"; var powerNormalGHGEvaluateItem2 = "C2外購電力(一般用電)"; if (delete || !serviceData.Any(x => x.GHGEvaluateItem == powerNormalGHGEvaluateItem1)) { var powerAssmt = new LCARiskAssmtSurveyForm_LifecycleAssmt() { LCAID = LCAID, LifeCycleStage = 3, GHGEvaluateItem = powerNormalGHGEvaluateItem1, ActivityIntensity = sumPowerNormal, KgCO2e = 0.0923m, Unit = "每度電(Kw/h)", EmissionKg = sumPowerNormal * 0.0923m, EmissionT = sumPowerNormal * 0.0923m / 1000 }; result.Add(powerAssmt); _db.Entry(powerAssmt).State = EntityState.Added; } else { var updateItem = serviceData.FirstOrDefault(x => x.GHGEvaluateItem == powerNormalGHGEvaluateItem1 && x.ActivityIntensity != sumPowerNormal); if (updateItem != null) { updateItem.ActivityIntensity = sumPowerNormal; updateItem.EmissionKg = sumPowerNormal * 0.0923m; updateItem.EmissionT = sumPowerNormal * 0.0923m / 1000; } } if (delete || !serviceData.Any(x => x.GHGEvaluateItem == powerNormalGHGEvaluateItem2)) { var powerAssmt = new LCARiskAssmtSurveyForm_LifecycleAssmt() { LCAID = LCAID, LifeCycleStage = 3, GHGEvaluateItem = powerNormalGHGEvaluateItem2, ActivityIntensity = sumPowerNormal, KgCO2e = 0.8042m, Unit = "每度電(Kw/h)", EmissionKg = sumPowerNormal * 0.8042m, EmissionT = sumPowerNormal * 0.8042m / 1000 }; result.Add(powerAssmt); _db.Entry(powerAssmt).State = EntityState.Added; } else { var updateItem = serviceData.FirstOrDefault(x => x.GHGEvaluateItem == powerNormalGHGEvaluateItem2 && x.ActivityIntensity != sumPowerNormal); if (updateItem != null) { updateItem.ActivityIntensity = sumPowerNormal; updateItem.EmissionKg = sumPowerNormal * 0.8042m; updateItem.EmissionT = sumPowerNormal * 0.8042m / 1000; } } } //if (sumPowerGreen > 0) //{ //} var sumWaterUsage = waterUsages.Sum(x => x.Scalar); if (sumWaterUsage > 0) { var waterUsageGHGEvaluateItem = "用水"; if (delete || !serviceData.Any(x => x.GHGEvaluateItem == waterUsageGHGEvaluateItem)) { var powerAssmt = new LCARiskAssmtSurveyForm_LifecycleAssmt() { LCAID = LCAID, LifeCycleStage = 3, GHGEvaluateItem = waterUsageGHGEvaluateItem, ActivityIntensity = sumWaterUsage, KgCO2e = 0.299m, Unit = "m3", EmissionKg = sumWaterUsage * 0.299m, EmissionT = sumWaterUsage * 0.299m / 1000 }; result.Add(powerAssmt); _db.Entry(powerAssmt).State = EntityState.Added; } else { var updateItem = serviceData.FirstOrDefault(x => x.GHGEvaluateItem == waterUsageGHGEvaluateItem && x.ActivityIntensity != sumWaterUsage); if (updateItem != null) { updateItem.ActivityIntensity = sumWaterUsage; updateItem.EmissionKg = sumWaterUsage * 0.299m; updateItem.EmissionT = sumWaterUsage * 0.299m / 1000; } } } if (delete || !serviceData.Any(x => x.GHGEvaluateItem == "購買顧問服務")) { var buyAssmt = new LCARiskAssmtSurveyForm_LifecycleAssmt() { LCAID = LCAID, LifeCycleStage = 3, GHGEvaluateItem = "購買顧問服務", ActivityIntensity = 0, KgCO2e = 0.66m, Unit = "度", EmissionKg = 0m, EmissionT = 0m, }; result.Add(buyAssmt); _db.Entry(buyAssmt).State = EntityState.Added; } if (delete || !serviceData.Any(x => x.GHGEvaluateItem == "資本貨物")) { var goodsAssmt = new LCARiskAssmtSurveyForm_LifecycleAssmt() { LCAID = LCAID, LifeCycleStage = 3, GHGEvaluateItem = "資本貨物", ActivityIntensity = 0, KgCO2e = 0.007m, Unit = "kg CO2e/台幣", EmissionKg = 0m, EmissionT = 0m, }; result.Add(goodsAssmt); _db.Entry(goodsAssmt).State = EntityState.Added; } } string GetFuelType(string value) { var index = value.IndexOf(','); var lastIndex = value.LastIndexOf(','); return value.Substring(value.IndexOf(",") + 1, lastIndex - index - 1); } return result; } /// /// 更新下游运输资料 /// /// /// private IEnumerable UpdateDownstreamDelivery( IEnumerable deliveryData , int LCAID, /*bool update,*/ bool delete) { var result = new List(); if (delete) { foreach (var data in deliveryData) { _db.Entry(data).State = EntityState.Deleted; } } //else //{ // result.AddRange(deliveryData); //} //if (update) { var waste = _db.Set().Where(x => x.LCAID == LCAID).ToList(); var deliveries = _db.Set().Where(x => x.LCAID == LCAID).ToList(); var lca = base.GetLCA(LCAID); if (delete || !deliveryData.Any(x => x.GHGEvaluateItem == "廢棄物運輸")) { var wasteAssmt = new LCARiskAssmtSurveyForm_LifecycleAssmt() { LCAID = LCAID, LifeCycleStage = 4, GHGEvaluateItem = "廢棄物運輸", ActivityIntensity = lca.WasteMaterialTotalOutputKg, KgCO2e = 0.235m, Unit = "tkm", EmissionKg = lca.WasteMaterialTotalOutputKg * 0.235m, EmissionT = lca.WasteMaterialTotalOutputKg * 0.235m / 1000, }; result.Add(wasteAssmt); _db.Entry(wasteAssmt).State = EntityState.Added; } else { var updateItem = deliveryData.FirstOrDefault(x => x.GHGEvaluateItem == "廢棄物運輸" && x.ActivityIntensity != lca.WasteMaterialTotalOutputKg); if (updateItem != null) { updateItem.ActivityIntensity = lca.WasteMaterialTotalOutputKg; updateItem.EmissionKg = lca.WasteMaterialTotalOutputKg * 0.235m; updateItem.EmissionT = lca.WasteMaterialTotalOutputKg * 0.235m / 1000; } } var sumWasteQuantity = waste.Sum(x => x.TotalQuantity); if (delete || !deliveryData.Any(x => x.GHGEvaluateItem == "回收物運輸")) { var wasteAssmt = new LCARiskAssmtSurveyForm_LifecycleAssmt() { LCAID = LCAID, LifeCycleStage = 4, GHGEvaluateItem = "回收物運輸", ActivityIntensity = sumWasteQuantity, KgCO2e = 0.235m, Unit = "tkm", EmissionKg = sumWasteQuantity * 0.235m, EmissionT = sumWasteQuantity * 0.235m / 1000, }; result.Add(wasteAssmt); _db.Entry(wasteAssmt).State = EntityState.Added; } else { var updateItem = deliveryData.FirstOrDefault(x => x.GHGEvaluateItem == "回收物運輸" && x.ActivityIntensity != sumWasteQuantity); if (updateItem != null) { updateItem.ActivityIntensity = sumWasteQuantity; updateItem.EmissionKg = sumWasteQuantity * 0.235m; updateItem.EmissionT = sumWasteQuantity * 0.235m / 1000; } } var sumTkmland = deliveries.Sum(x => x.TotalTkmland); var sumTkmsea = deliveries.Sum(x => x.TransportTkmsea); if (sumTkmland > 0) { if (delete || !deliveryData.Any(x => x.GHGEvaluateItem == "貨物運輸(陸運)")) { var landAssmt = new LCARiskAssmtSurveyForm_LifecycleAssmt() { LCAID = LCAID, LifeCycleStage = 4, GHGEvaluateItem = "貨物運輸(陸運)", ActivityIntensity = sumTkmland, KgCO2e = 0.235m, Unit = "tkm", EmissionKg = sumTkmland * 0.235m, EmissionT = sumTkmland * 0.235m / 1000 }; result.Add(landAssmt); _db.Entry(landAssmt).State = EntityState.Added; } else { var updateItem = deliveryData.FirstOrDefault(x => x.GHGEvaluateItem == "貨物運輸(陸運)" && x.ActivityIntensity != sumTkmland); if (updateItem != null) { updateItem.ActivityIntensity = sumTkmland; updateItem.EmissionKg = sumTkmland * 0.235m; updateItem.EmissionT = sumTkmland * 0.235m / 1000; } } } if (sumTkmsea > 0) { if (delete || !deliveryData.Any(x => x.GHGEvaluateItem == "貨物運輸(海運)")) { var seaAssmt = new LCARiskAssmtSurveyForm_LifecycleAssmt() { LCAID = LCAID, LifeCycleStage = 4, GHGEvaluateItem = "貨物運輸(海運)", ActivityIntensity = sumTkmsea, KgCO2e = 0.0198m, Unit = "tkm", EmissionKg = sumTkmsea * 0.0198m, EmissionT = sumTkmsea * 0.0198m / 1000 }; result.Add(seaAssmt); _db.Entry(seaAssmt).State = EntityState.Added; } else { var updateItem = deliveryData.FirstOrDefault(x => x.GHGEvaluateItem == "貨物運輸(海運)" && x.ActivityIntensity != sumTkmsea); if (updateItem != null) { updateItem.ActivityIntensity = sumTkmsea; updateItem.EmissionKg = sumTkmsea * 0.0198m; updateItem.EmissionT = sumTkmsea * 0.0198m / 1000; } } } } return result; } /// /// 更新产品使用及废弃资料 /// /// /// private IEnumerable UpdateProduct( IEnumerable productData , int LCAID, /*bool update,*/ bool delete) { var result = new List(); if (delete) { foreach (var data in productData) { _db.Entry(data).State = EntityState.Deleted; } } //else //{ // result.AddRange(productData); //} //if (update) { var deliveries = _db.Set().Where(x => x.LCAID == LCAID).ToList(); var power = _db.Set().Where(x => x.LCAID == LCAID).ToList(); foreach (var group in power.GroupBy(x => x.ModelType)) { var modelType = group.Key; var ghgEvaluateItem = $"產品使用造成溫室氣體排放({modelType})"; var delivery = deliveries.FirstOrDefault(x => x.ModelName == modelType); if (delivery != null) { var activityIntensity = delivery.DeliveryAmount * group.Sum(x => x.PowerLossPerYear); if (delete || !productData.Any(x => x.GHGEvaluateItem == ghgEvaluateItem)) { var seaAssmt = new LCARiskAssmtSurveyForm_LifecycleAssmt() { LCAID = LCAID, LifeCycleStage = 5, GHGEvaluateItem = ghgEvaluateItem, ActivityIntensity = activityIntensity, KgCO2e = 0.509m, Unit = "kgCO2e", EmissionKg = activityIntensity * 0.509m, EmissionT = activityIntensity * 0.509m / 1000 }; result.Add(seaAssmt); _db.Entry(seaAssmt).State = EntityState.Added; } else { var updateItem = productData.FirstOrDefault(x => x.GHGEvaluateItem == ghgEvaluateItem && x.ActivityIntensity != activityIntensity); if (updateItem != null) { updateItem.ActivityIntensity = activityIntensity; updateItem.EmissionKg = activityIntensity * 0.509m; updateItem.EmissionT = activityIntensity * 0.509m / 1000; } } } } if (delete || !productData.Any(x => x.GHGEvaluateItem == "產品廢棄階段溫室氣體排放(回收)")) { var productAssmt = new LCARiskAssmtSurveyForm_LifecycleAssmt() { LCAID = LCAID, LifeCycleStage = 5, GHGEvaluateItem = "產品廢棄階段溫室氣體排放(回收)", ActivityIntensity = 0, KgCO2e = 0.12m, Unit = "kg", EmissionKg = 0m, EmissionT = 0m, }; result.Add(productAssmt); _db.Entry(productAssmt).State = EntityState.Added; } if (delete || !productData.Any(x => x.GHGEvaluateItem == "產品廢棄階段溫室氣體排放(焚化)")) { var productAssmt = new LCARiskAssmtSurveyForm_LifecycleAssmt() { LCAID = LCAID, LifeCycleStage = 5, GHGEvaluateItem = "產品廢棄階段溫室氣體排放(焚化)", ActivityIntensity = 0, KgCO2e = 360m, Unit = "噸", EmissionKg = 0m, EmissionT = 0m, }; result.Add(productAssmt); _db.Entry(productAssmt).State = EntityState.Added; } } return result; } /// /// 更新废弃物处理资料 /// /// /// private IEnumerable UpdateWaste( IEnumerable wasteData , int LCAID, /*bool update,*/ bool delete) { var result = new List(); if (delete) { foreach (var data in wasteData) { _db.Entry(data).State = EntityState.Deleted; } } //else //{ // result.AddRange(wasteData); //} //if (update) { var waste = _db.Set().Where(x => x.LCAID == LCAID).ToList(); foreach (var item in waste) { if (delete || !wasteData.Any(x => x.GHGEvaluateItem == item.MaterialName)) { var wasteAssmt = new LCARiskAssmtSurveyForm_LifecycleAssmt() { LCAID = LCAID, LifeCycleStage = 6, GHGEvaluateItem = item.MaterialName, ActivityIntensity = item.TotalQuantity, KgCO2e = 0m, Unit = "kg", EmissionKg = 0m, EmissionT = 0m, }; result.Add(wasteAssmt); _db.Entry(wasteAssmt).State = EntityState.Added; } } } return result; } public LCARiskAssmtSurveyForm_LifecycleAssmt Save(LCARiskAssmtSurveyForm_LifecycleAssmt toBeSave) { var user = GetUserContext(); if (!AuthorizedLCAs.Contains(toBeSave.LCAID)) throw new Exception("not authorized"); ThrowExceptionIfDuplicate(toBeSave); var entry = _db.Entry(toBeSave); var other = _db.Set() .Where(x => x.LCAID == toBeSave.LCAID && x.ID != toBeSave.ID).ToList(); var sumEmissionT = other.Sum(x => x.EmissionT); toBeSave.ActivityIntensity = Math.Round(toBeSave.ActivityIntensity, 4); toBeSave.KgCO2e = Math.Round(toBeSave.KgCO2e, 10); if (toBeSave.ID == 0) { toBeSave.CreatedBy = user.Id; toBeSave.CreatedDate = DateTime.Now; entry.State = EntityState.Added; } else { toBeSave.ModifiedBy = user.Id; toBeSave.ModifiedDate = DateTime.Now; entry.State = EntityState.Modified; entry.Property(x => x.LCAID).IsModified = false; } sumEmissionT += toBeSave.EmissionT; foreach (var data in other) { data.Percentage = Math.Round((data.EmissionT / sumEmissionT) * 100, 4); } _db.SaveChanges(); return toBeSave; } private void ThrowExceptionIfDuplicate(LCARiskAssmtSurveyForm_LifecycleAssmt toBeSave) { var qry = _db.Set().Where(x => x.LCAID == toBeSave.LCAID && x.ID != toBeSave.ID && x.LifeCycleStage == toBeSave.LifeCycleStage && x.GHGEvaluateItem == toBeSave.GHGEvaluateItem); if (qry!=null && qry.ToList().Count>0) { throw new Exception($"同一生命周期,評估項目 {toBeSave.GHGEvaluateItem} 不能重複"); } } public void Delete(int ID) { var entry = _db.Set().Where(x => x.ID == ID).Single(); var left = _db.Set().Where(x => x.LCAID == entry.LCAID && x.ID != ID).ToList(); var LCA = GetLCA(entry.LCAID); if (LCA.Status != LCAStatus.New && LCA.Status != LCAStatus.Processing) throw new Exception("Business logic error , should not delete data in this status: " + LCA.Status.ToString()); var ToBeDelete = _db.Entry(entry); ToBeDelete.State = EntityState.Deleted; if (left.Count > 0) { UpdatePercentage(left); } _db.SaveChanges(); } public class IntlTravel { /// /// 起點(機場) /// public string From { get; set; } /// /// 中轉站/迄點(機場) /// public string To { get; set; } /// /// 组数 /// public int Count { get; set; } } public class Vehicle { public string FuelType { get; set; } public decimal Scalar { get; set; } } } }