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; }
}
}
}