988 lines
44 KiB
C#
988 lines
44 KiB
C#
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)
|
||
{
|
||
}
|
||
|
||
/// <summary>
|
||
/// 將用電量同步到風險評估的C2,C4生命週期項目
|
||
/// </summary>
|
||
/// <param name="Scalar"></param>
|
||
/// <param name="para"></param>
|
||
/// <returns></returns>
|
||
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<LCARiskAssmtSurveyForm_LifecycleAssmt> GetList(int LCAID)
|
||
{
|
||
if (!AuthorizedLCAs.Contains(LCAID)) throw new Exception("not authorized");
|
||
return _db.Set<LCARiskAssmtSurveyForm_LifecycleAssmt>().Where(x => x.LCAID == LCAID)
|
||
.OrderByDescending(x => x.ID);
|
||
}
|
||
|
||
public IEnumerable<LifecycleAssmtItemDto> GetItems()
|
||
{
|
||
return _db.Set<LCARiskAssmtSurveyForm_LifecycleAssmtItem>()
|
||
.ToList()
|
||
.Select(x => new LifecycleAssmtItemDto()
|
||
{
|
||
ID = x.ID,
|
||
LifeCycleStage = x.LifeCycleStage,
|
||
DisplayName = x.DisplayName
|
||
});
|
||
}
|
||
|
||
public IEnumerable<LCARiskAssmtSurveyForm_LifecycleAssmt> Sync(int LCAID, UpdateLIfecycleAssmtDTO input)
|
||
{
|
||
// 生命週期階段的大update
|
||
var oldLifecycleAssmtDataData = _db.Set<LCARiskAssmtSurveyForm_LifecycleAssmt>().Where(x => x.LCAID == LCAID).ToList();
|
||
var newLifecycleAssmtData = new List<LCARiskAssmtSurveyForm_LifecycleAssmt>();
|
||
|
||
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<int, string> 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<LCARiskAssmtSurveyForm_LifecycleAssmt> 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());
|
||
}
|
||
/// <summary>
|
||
/// 更新原料取得资料
|
||
/// </summary>
|
||
/// <param name="LCAID"></param>
|
||
/// <param name="delete"></param>
|
||
private IEnumerable<LCARiskAssmtSurveyForm_LifecycleAssmt> UpdateMaterial(
|
||
IEnumerable<LCARiskAssmtSurveyForm_LifecycleAssmt> materialData
|
||
, int LCAID, /*bool update,*/ bool delete)
|
||
{
|
||
var result = new List<LCARiskAssmtSurveyForm_LifecycleAssmt>();
|
||
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<LCARiskAssmtSurveyForm_MaterialC3Emission>().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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 更新上游运输资料
|
||
/// </summary>
|
||
/// <param name="LCAID"></param>
|
||
/// <param name="delete"></param>
|
||
private IEnumerable<LCARiskAssmtSurveyForm_LifecycleAssmt> UpdateUpstreamDelivery(
|
||
IEnumerable<LCARiskAssmtSurveyForm_LifecycleAssmt> deliveryData
|
||
, int LCAID, /*bool update,*/ bool delete)
|
||
{
|
||
var result = new List<LCARiskAssmtSurveyForm_LifecycleAssmt>();
|
||
if (delete)
|
||
{
|
||
foreach (var data in deliveryData)
|
||
{
|
||
_db.Entry(data).State = EntityState.Deleted;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
result.AddRange(deliveryData);
|
||
}
|
||
//if (update)
|
||
{
|
||
var purchase = _db.Set<LCARiskAssmtSurveyForm_ItemPurchase>().Where(x => x.LCAID == LCAID).ToList(); // 採購及運輸地址
|
||
var travel = _db.Set<LCARiskAssmtSurveyForm_IntlTravel>().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<IntlTravel>();
|
||
//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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 更新运作支援及服务资料
|
||
/// </summary>
|
||
/// <param name="LCAID"></param>
|
||
/// <param name="delete"></param>
|
||
private IEnumerable<LCARiskAssmtSurveyForm_LifecycleAssmt> UpdateService(
|
||
IEnumerable<LCARiskAssmtSurveyForm_LifecycleAssmt> serviceData
|
||
, int LCAID, /*bool update,*/ bool delete)
|
||
{
|
||
var result = new List<LCARiskAssmtSurveyForm_LifecycleAssmt>();
|
||
if (delete)
|
||
{
|
||
foreach (var data in serviceData)
|
||
{
|
||
_db.Entry(data).State = EntityState.Deleted;
|
||
}
|
||
}
|
||
//else
|
||
//{
|
||
// result.AddRange(serviceData);
|
||
//}
|
||
//if (update)
|
||
{
|
||
var vehicles = _db.Set<LCACommonSurveyForm_Vehicles>().Where(x => x.LCAID == LCAID).ToList();
|
||
var powerUsages = _db.Set<LCACommonSurveyForm_PowerUsages>().Where(x => x.LCAID == LCAID).ToList();
|
||
var waterUsages = _db.Set<LCARiskAssmtSurveyForm_WaterUsages>().Where(x => x.LCAID == LCAID).ToList();
|
||
var options = GetYearlyParameterOptions(Categories.Vehicle);
|
||
var vehicleItems = new List<Vehicle>();
|
||
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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 更新下游运输资料
|
||
/// </summary>
|
||
/// <param name="LCAID"></param>
|
||
/// <param name="delete"></param>
|
||
private IEnumerable<LCARiskAssmtSurveyForm_LifecycleAssmt> UpdateDownstreamDelivery(
|
||
IEnumerable<LCARiskAssmtSurveyForm_LifecycleAssmt> deliveryData
|
||
, int LCAID, /*bool update,*/ bool delete)
|
||
{
|
||
var result = new List<LCARiskAssmtSurveyForm_LifecycleAssmt>();
|
||
if (delete)
|
||
{
|
||
foreach (var data in deliveryData)
|
||
{
|
||
_db.Entry(data).State = EntityState.Deleted;
|
||
}
|
||
}
|
||
//else
|
||
//{
|
||
// result.AddRange(deliveryData);
|
||
//}
|
||
//if (update)
|
||
{
|
||
var waste = _db.Set<LCARiskAssmtSurveyForm_WasteMaterial>().Where(x => x.LCAID == LCAID).ToList();
|
||
var deliveries = _db.Set<LCARiskAssmtSurveyForm_ItemDelivery>().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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 更新产品使用及废弃资料
|
||
/// </summary>
|
||
/// <param name="LCAID"></param>
|
||
/// <param name="delete"></param>
|
||
private IEnumerable<LCARiskAssmtSurveyForm_LifecycleAssmt> UpdateProduct(
|
||
IEnumerable<LCARiskAssmtSurveyForm_LifecycleAssmt> productData
|
||
, int LCAID, /*bool update,*/ bool delete)
|
||
{
|
||
var result = new List<LCARiskAssmtSurveyForm_LifecycleAssmt>();
|
||
if (delete)
|
||
{
|
||
foreach (var data in productData)
|
||
{
|
||
_db.Entry(data).State = EntityState.Deleted;
|
||
}
|
||
}
|
||
//else
|
||
//{
|
||
// result.AddRange(productData);
|
||
//}
|
||
//if (update)
|
||
{
|
||
var deliveries = _db.Set<LCARiskAssmtSurveyForm_ItemDelivery>().Where(x => x.LCAID == LCAID).ToList();
|
||
var power = _db.Set<LCARiskAssmtSurveyForm_PowerConsumption>().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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 更新废弃物处理资料
|
||
/// </summary>
|
||
/// <param name="LCAID"></param>
|
||
/// <param name="delete"></param>
|
||
private IEnumerable<LCARiskAssmtSurveyForm_LifecycleAssmt> UpdateWaste(
|
||
IEnumerable<LCARiskAssmtSurveyForm_LifecycleAssmt> wasteData
|
||
, int LCAID, /*bool update,*/ bool delete)
|
||
{
|
||
var result = new List<LCARiskAssmtSurveyForm_LifecycleAssmt>();
|
||
if (delete)
|
||
{
|
||
foreach (var data in wasteData)
|
||
{
|
||
_db.Entry(data).State = EntityState.Deleted;
|
||
}
|
||
}
|
||
//else
|
||
//{
|
||
// result.AddRange(wasteData);
|
||
//}
|
||
//if (update)
|
||
{
|
||
var waste = _db.Set<LCARiskAssmtSurveyForm_WasteMaterial>().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<LCARiskAssmtSurveyForm_LifecycleAssmt>()
|
||
.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<LCARiskAssmtSurveyForm_LifecycleAssmt>().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<LCARiskAssmtSurveyForm_LifecycleAssmt>().Where(x => x.ID == ID).Single();
|
||
var left = _db.Set<LCARiskAssmtSurveyForm_LifecycleAssmt>().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
|
||
{
|
||
/// <summary>
|
||
/// 起點(機場)
|
||
/// </summary>
|
||
public string From { get; set; }
|
||
|
||
/// <summary>
|
||
/// 中轉站/迄點(機場)
|
||
/// </summary>
|
||
public string To { get; set; }
|
||
|
||
/// <summary>
|
||
/// 组数
|
||
/// </summary>
|
||
public int Count { get; set; }
|
||
}
|
||
|
||
public class Vehicle
|
||
{
|
||
public string FuelType { get; set; }
|
||
|
||
public decimal Scalar { get; set; }
|
||
}
|
||
}
|
||
} |