demo20230512/Service/WeeeLCADataService.cs

3213 lines
174 KiB
C#
Raw Normal View History

2023-05-12 10:20:28 +08:00
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using Weee.Supports;
using Weee.DAL;
using Weee.Models;
using Weee.Models.ExtensionMethods;
using Weee.Models.Paramemter;
using Weee.DataTransferObject;
using NPOI.SS.UserModel;
// 使用 openxml 匯出 word
using DocumentFormat.OpenXml.Packaging;
using log4net;
using Qcarbon.ViewModels.ExcelImportExport.LcaOrganization.excelExportOrgLCAdata;
using Qcarbon.ViewModels.ExcelImportExport.LcaOrganization.excelExportOrgLCArisk;
using ClosedXML.Excel;
using Qcarbon.Interfaces;
using Qcarbon.ExcelImportExport.LcaOrganization;
using Qcarbon.Interfaces.Database.Lca.Org12.Reports;
using Qcarbon.Database.Lca.Org12.Reports;
using Qcarbon.ViewModels.ExcelImportExport.LcaOrganization.excelExportOrgList;
using NLog;
using Microsoft.AspNet.Identity;
using static Weee.DataTransferObject.OrganizationLCAReportDTO;
using System.Threading;
using Qcarbon.Database.Lca.Org12.Reports.excelExportOrgList;
using Qcarbon.Interfaces.adminCheck;
using Qcarbon.Database.adminCheck;
using Qcarbon.ViewModels.admin;
using Qcarbon.ViewModels.DTO;
using Qcarbon.Database.Lca.Org12.Reports.excelExportOrgList.merged;
using Qcarbon.Interfaces.Database.Lca.Prod;
using Qcarbon.Interfaces.ExcelImportExport.LcaProduct;
using Qcarbon.Database.Lca.Prod;
using Qcarbon.ExcelImportExport.LcaProduct;
using Qcarbon.ViewModels.ExcelImportExport.LcaProduct.excelExportProdLCAdata;
using Qcarbon.ViewModels.ExcelImportExport.LcaProduct.excelExportProdList;
using Qcarbon.ViewModels.ExcelImportExport.LcaProduct.excelExportProdSensitivity;
using Qcarbon.Database.Lca.Org12;
using Qcarbon.Database.Lca.Org36;
using Qcarbon.Database.Lca;
using Qcarbon.ViewModels.ExcelImportExport.LcaOrganization;
using Resources;
using Qcarbon.ExcelImportExport.LcaOrganization.excelImportLCAdata;
using System.EnterpriseServices;
using AutoMapper;
namespace Weee.Service
{
public class WeeeLCADataService : WeeeDataAuthorizeService
{
//public delegate void UpdateStatusEventHandler(object sender, EventArgs e);
//public event UpdateStatusEventHandler UpdateStatus;
protected IadminCheckService _adminCheckService;
protected IcompanyAdminCheckService _companyAdminCheckService;
protected LCAcommonService _LCAcommonService;
protected Logger log;
private readonly EmailService.Service service = DependencyResolver.Current.GetService<EmailService.Service>();
public WeeeLCADataService(WeeeDataContext d)
: base(d)
{
_LCAcommonService = new LCAcommonService(d);
log = NLog.LogManager.GetCurrentClassLogger();
}
/// <summary>
/// 產品型盤查狀態變化時 如有完整性 , 一致性之業務邏輯檢查 應於此實作
/// </summary>
#region Business logic for Product LCA
public void ProductLCANewToProcessing(int LCAID, string userName, string baseUrl)//DL-41
{
if (!AuthorizedLCAs.Contains(LCAID))
throw new Exception("not authorzied");
var LCA = _db.ProductLCAs.Where(x => x.ID == LCAID && x.Status == LCAStatus.New)
.Include(x => x.Materials).Single();
var trans = _db.Database.BeginTransaction();
try
{
foreach (var material in LCA.Materials.Where(x => x.IncludedInInterrogation.HasValue && x.IncludedInInterrogation.Value))
{
// create child LCA for each material to send to supplier company
var request = new ProductLCAReplyRequest()
{
SenderCompanyName = CurrentCompany.Name,
//Distribute = material.Unit, 無用的欄位錯誤不匹配的assignment
ReceiverCompanyID = material.SupplierCompanyID
};//DL-49
if (material.SupplierCompanyEmail != null && material.SupplierCompanyEmail != "")
{
material.RequestSent = request;
service.SendRequestMessaage(material.SupplierCompanyEmail, CurrentCompany.Name, request.RequestLink
, request.AnonymousReplyLink, material.PartNumber, material.Name, userName, request.Uid
, baseUrl);//DL-41
// to do: send an email link for user to apply
}
}
LCA.Status = LCAStatus.Processing;
LCA.StatusHistory.Add(new LCAStatusLog(LCAStatus.Processing, GetUserContext().Name));
_db.SaveChanges();
trans.Commit();
}
catch(Exception ex)
{
trans.Rollback();
log.Error(ex);
log.Error(CScommon.Exceptions.inner(ex));
log.Error(ex.StackTrace);
throw;
}
Thread.Sleep(0);
}
public string ProductLCAProcessingToWait(string sourceDir, string targetFile
, int LCAID, string userName,string baseUrl, bool changeStatus = true
, bool wordReportOnly = true, bool skipAuthorization = false)
{
if (!skipAuthorization && !AuthorizedLCAs.Contains(LCAID))
throw new Exception("not authorzied");
//var qry = _db.ProductLCAs
// .Include(x => x.Comments)
// .Where(x => x.ID == LCAID //&& x.Status == LCAStatus.Processing
// ).FirstOrDefault();
var lca = _db.ProductLCAs
.Include(x => x.Comments)
.Where(x => x.ID == LCAID //&& x.Status == LCAStatus.Processing
).Single();
if (lca.SnapShotSurveyResult == null)
lca.SnapShotSurveyResult = new ProductLCAFabSurveyResult(lca, lca.TargetProduct);
lca.SnapShotSurveyResult.Scope1FabResult = lca.GetScopeOnePrimaryFabKgCO2e();
lca.SnapShotSurveyResult.Scope2FabResult = lca.GetScopeTwoPrimaryFabKgCO2e();
lca.SnapShotSurveyResult.Scope3FabResult = lca.GetScopeThreePrimaryFabKgCO2e();
lca.SnapShotSurveyResult.SecondaryWasteResult = lca.WasteSheet.Sum(x => x.KgCO2e);
lca.SnapShotSurveyResult.SecondaryWasteTransportResult = lca.WasteTransportSheet.Sum(x => x.KgCO2e);
lca.SnapShotSurveyResult.SecondaryDirectMaterialResult = lca.Materials.Where(x => x.MaterialType == MaterialType.DirectMaterial).Sum(x => x.KgCO2e);
lca.SnapShotSurveyResult.SecondaryIndirectMaterialResult = lca.Materials.Where(x => x.MaterialType == MaterialType.IndirectMaterial).Sum(x => x.KgCO2e);
lca.SnapShotSurveyResult.SecondaryWrapMaterialResult = lca.Materials.Where(x => x.MaterialType == MaterialType.WrapMaterial).Sum(x => x.KgCO2e);
var totalTransportPCS = lca.TransportSheet.Sum(x => x.TransportQuantity);
totalTransportPCS = totalTransportPCS == 0m ? 1m : totalTransportPCS;
lca.SnapShotSurveyResult.SecondaryTransportResult = lca.TransportSheet.Sum(x => x.KgCO2e) / totalTransportPCS;
var totalFabResult = lca.SnapShotSurveyResult.Scope1FabResult
+ lca.SnapShotSurveyResult.Scope2FabResult
+ lca.SnapShotSurveyResult.Scope3FabResult
+ lca.SnapShotSurveyResult.SecondaryWasteResult
+ lca.SnapShotSurveyResult.SecondaryWasteTransportResult;
var totalProductResult = lca.SnapShotSurveyResult.SecondaryDirectMaterialResult
+ lca.SnapShotSurveyResult.SecondaryIndirectMaterialResult
+ lca.SnapShotSurveyResult.SecondaryWrapMaterialResult
+ lca.SnapShotSurveyResult.SecondaryTransportResult;
var areaFactor = lca.SnapShotSurveyResult.constantFactorInArea;
var weightFactor = lca.SnapShotSurveyResult.constantFactorInWeight;
var workHourFactor = lca.SnapShotSurveyResult.constantFactorInWorkHour;
lca.DistributeKgCO2eInWeight = null;
lca.DistributeKgCO2eInArea = null;
lca.DistributeKgCO2eInWorkHour = null;
lca.DistributeKgCO2e = lca.GetDistributedKgCO2e();
if (areaFactor != null)
lca.DistributeKgCO2eInArea = totalFabResult * areaFactor.Value + totalProductResult;
if (weightFactor != null)
lca.DistributeKgCO2eInWeight = totalFabResult * weightFactor.Value + totalProductResult;
if (workHourFactor != null)
lca.DistributeKgCO2eInWorkHour = totalFabResult * workHourFactor.Value + totalProductResult;
// start of save carbon footprint result
if (!wordReportOnly)
{
var productLcaExcelExporter = new ProductLCAExcelExporter();
var productLcaWorkbook = productLcaExcelExporter.CreateWorkbook();
var productLcaSheet = productLcaExcelExporter.CreateSheet(productLcaWorkbook, "碳足跡結果");
productLcaExcelExporter.CreateInsertableArea(productLcaSheet, 0, 34, 0, 8);
productLcaExcelExporter.InsertLcaData(productLcaWorkbook, productLcaSheet, lca);
// end of save carbon footprint result
SaveExcel(productLcaWorkbook, lca, "CarbonResult", userName, baseUrl);
// start of save carbon footprint inventory
var inventoryExcelExporter = new ProductLCAInventoryExcelExporter();
var inventoryWorkbook = inventoryExcelExporter.CreateWorkbook();
var carbonDataSheet = inventoryExcelExporter.CreateSheet(inventoryWorkbook, "CO2DATA");
inventoryExcelExporter.CreateInsertableArea(carbonDataSheet, 0, lca.Materials.Count() + 100, 0, 20);
MemoryStream chartImage;
inventoryExcelExporter.InsertCO2Data(inventoryWorkbook, carbonDataSheet, lca, out chartImage);
SaveExcel(inventoryWorkbook, lca, "Inventory", userName, baseUrl);
}
// end of save carbon footprint inventory
// start of generate word report
//ExportWordReport(lca, chartImage, userName);
string ret = ExportWordReport(lca, sourceDir, targetFile, LCAID, userName, baseUrl);
// end
if (!changeStatus) // 如果僅產生報表不變更狀態
return ret;
lca.Comments.ToList().ForEach(x => x.IsHistory = true);
lca.Status = LCAStatus.Waiting;
lca.StatusHistory.Add(new LCAStatusLog(LCAStatus.Waiting, GetUserContext().Name));
_db.SaveChanges();
return ret;
}
public void ProductLCAWaitToRejected(int LCAID)
{
if (CurrentCompany.CompanyType != typeof(CertificationCompany)) throw new Exception("this action is only avaliable for CertificationCompany");
if (!AuthorizedLCAs.Contains(LCAID)) throw new Exception("not authorzied");
var LCA = _db.ProductLCAs.Where(x => x.ID == LCAID && x.Status == LCAStatus.Waiting).Include(x => x.Comments).Single();
LCA.Status = LCAStatus.Rejected;
LCA.StatusHistory.Add(new LCAStatusLog(LCAStatus.Rejected, GetUserContext().Name));
// LCA.Comments.ToList().ForEach(x => x.IsHistory = true);
_db.SaveChanges();
}
public void ProductLCARejectedToProcessing(int LCAID)
{
if (!AuthorizedLCAs.Contains(LCAID)) throw new Exception("not authorzied");
var LCA = _db.ProductLCAs.Where(x => x.ID == LCAID && x.Status == LCAStatus.Rejected).Include(x => x.Comments).Single();
LCA.Status = LCAStatus.Processing;
LCA.StatusHistory.Add(new LCAStatusLog(LCAStatus.Processing, GetUserContext().Name));
_db.SaveChanges();
}
// create snapShot and generate excel
public void ProductLCAWaitToConfirmed(int LCAID)
{
if (CurrentCompany.CompanyType != typeof(CertificationCompany)) throw new Exception("this action is only avaliable for CertificationCompany");
if (!AuthorizedLCAs.Contains(LCAID)) throw new Exception("not authorzied");
var lca = _db.ProductLCAs.Include(x => x.SnapShotSurveyResult)
.Where(x => x.ID == LCAID && x.Status == LCAStatus.Waiting).Single();
lca.Status = LCAStatus.Confirmed;
lca.StatusHistory.Add(new LCAStatusLog(LCAStatus.Confirmed, GetUserContext().Name));
lca.Comments.ToList().ForEach(x => x.IsHistory = true);
_db.SaveChanges();
}
public void ProductLCAConfirmedToCompleted(int LCAID)
{
if (!AuthorizedLCAs.Contains(LCAID)) throw new Exception("not authorzied");
var lca = _db.ProductLCAs.Include(x => x.RepliedRequests).Where(x => x.ID == LCAID && x.Status == LCAStatus.Confirmed).Single();
lca.Status = LCAStatus.Completed;
lca.StatusHistory.Add(new LCAStatusLog(LCAStatus.Completed, GetUserContext().Name));
_db.SaveChanges();
}
#endregion
/// <summary>
/// 組織型盤查狀態變化時 如有完整性 , 一致性之業務邏輯檢查 應於此實作
/// </summary>
#region Business logic for Organization LCA
private string makeupDTOfields(OrganizationLCAReportDTO data
, string userID, int LCAID, bool isMergedRpt)
{
string ret = "";
try
{
var qry = (from a in _db.LCAs
where a.ID == LCAID
select a).FirstOrDefault();
data.ReportDate = DateTime.Today.ToString("yyyy/MM/dd");
if (qry == null)
{
ret = $"LCAID {LCAID} 查無資料";
data.RiskAssmtThreshold = 100;
}
else
{
data.LCAstartYear = qry.StartDate.Year.ToString();
data.LCAstart = qry.StartDate.ToString("yyyy/MM/dd");
data.LCAend = qry.EndDate.ToString("yyyy/MM/dd");
data.LCAstarter = qry.LCAStarter;
data.LCAstarterDepartment = qry.LCAStarterDepartment;
data.LCAstartPhone = qry.LCAStarterPhone;
data.LCAstartEmail = qry.LCAStarterEmail;
data.RiskAssmtThreshold = qry.GradingScore == 0 ? 100 : qry.GradingScore;
data.ListDefaultPurpose = string.IsNullOrWhiteSpace(qry.ListDefaultPurpose)
? CScommon.ProgramConstants.LIST_DEFAULT_PURPOSE : qry.ListDefaultPurpose;
var qry2 = (from a in _db.Companies
where a.ID == qry.OwnerID
select a).FirstOrDefault();
if (qry2 != null)
data.companyAddress = qry2.Address;
}
var qry3 = (from a1 in _db.LCAs // 基準年資料
from a2 in _db.LCAs // 若當下的資料並非基準年則先用LCAID取出該資料對應的BaseYearLCAID已取得對應的基準年資料a1
join b in _db.OrganizationLCAs on a1.ID equals b.ID
where (a1.isBaseYear == true && a1.ID == LCAID) || (a1.isBaseYear == true && a1.UserId == userID && a2.ID == LCAID && a1.ID == a2.BaseYearLCAID)
select a1)
.OrderByDescending(x => x.StartDate).Take(1).FirstOrDefault();
//var qry3 = _db.LCAs.Where(x => x.isBaseYear == true)
// .OrderByDescending(x => x.ID).Take(1).FirstOrDefault();
if (qry3 != null)
{
data.BaseYear = qry3.StartDate.Year;
decimal baseYearKgCO2e = 0;
var qry4a = _db.LCACommonSurveyForm_WorkHour
.Where(x => x.LCAID == qry3.ID);
if (qry4a != null)
{
foreach (var rec in qry4a)
baseYearKgCO2e += rec.KgCO2e;
}
var qry4b = _db.LCACommonSurveyForm_Vehicle
.Where(x => x.LCAID == qry3.ID);
if (qry4b != null)
{
foreach (var rec in qry4b)
baseYearKgCO2e += rec.KgCO2e;
}
var qry4c = _db.LCACommonSurveyForm_GasolineEquipment
.Where(x => x.LCAID == qry3.ID);
if (qry4c != null)
{
foreach (var rec in qry4c)
baseYearKgCO2e += rec.KgCO2e;
}
var qry4d = _db.LCACommonSurveyForm_Kitchen
.Where(x => x.LCAID == qry3.ID);
if (qry4d != null)
{
foreach (var rec in qry4d)
baseYearKgCO2e += rec.KgCO2e;
}
var qry4e = _db.LCACommonSurveyForm_FireEquipment
.Where(x => x.LCAID == qry3.ID);
if (qry4e != null)
{
foreach (var rec in qry4e)
baseYearKgCO2e += rec.KgCO2e;
}
var qry4f = _db.LCACommonSurveyForm_Refrigerant
.Where(x => x.LCAID == qry3.ID);
if (qry4f != null)
{
foreach (var rec in qry4f)
baseYearKgCO2e += rec.KgCO2e;
}
var qry4g = _db.LCACommonSurveyForm_SteamUsage
.Where(x => x.LCAID == qry3.ID);
if (qry4g != null)
{
foreach (var rec in qry4g)
baseYearKgCO2e += rec.KgCO2e;
}
var qry4h = _db.LCACommonSurveyForm_PowerUsage
.Where(x => x.LCAID == qry3.ID);
if (qry4h != null)
{
foreach (var rec in qry4h)
baseYearKgCO2e += rec.KgCO2e;
}
data.BaseYearTotalValue = baseYearKgCO2e / 1000;
}
IEnumerable<RiskAssmtFactorScoreVM> qry5 = null;
if (!isMergedRpt)
{
var qry5a = (from a in _db.LCARiskAssmtSurveyForm_AssmtFactors
join b in _db.LCARiskAssmtSurveyForm_AssmtFactorScores on a.ID equals b.FactorId
where a.LCAID == LCAID
select new RiskAssmtFactorScoreVM
{
FactorName = a.FactorName,
OptionDescription = b.OptionDescription,
OptionScore = b.OptionScore
});
if (qry5a.Any())
qry5 = qry5a.ToList();
}
else
{
var qry5a = (from a in _db.LCARiskAssmtSurveyForm_AssmtFactors
join b in _db.LCARiskAssmtSurveyForm_AssmtFactorScores on a.ID equals b.FactorId
join e in _db.LCAs on a.LCAID equals e.ID
where e.parentLCAID == LCAID
select new RiskAssmtFactorScoreVM
{
FactorName = a.FactorName,
OptionDescription = b.OptionDescription,
OptionScore = b.OptionScore
});
if (qry5a.Any())
qry5 = qry5a.ToList();
}
data.RiskAssmtFactorText = "評估因子:";
if (qry5 != null)
{
string curFactor = "";
string oneFactor = "";
foreach (var rec in qry5)
{
if (rec.FactorName != curFactor)
{
if (curFactor != "")
data.RiskAssmtFactorText += $"{curFactor}:({oneFactor})";
curFactor = rec.FactorName;
oneFactor = $"{rec.OptionDescription},{rec.OptionScore}分;";
}
else
oneFactor += $"{rec.OptionDescription},{rec.OptionScore}分;";
}
data.RiskAssmtFactorText += $"{curFactor}:({oneFactor})";
}
}
catch (Exception ex)
{
Logger log = NLog.LogManager.GetCurrentClassLogger();
log.Error(ex.StackTrace);
ex = CScommon.Exceptions.inner(ex);
ret = ex.Message;
throw;
}
return ret;
}
public void OrganizationLCAProcessingToWait(int LCAID, string userID, string userName, string baseUrl)
{
if (!AuthorizedLCAs.Contains(LCAID)) throw new Exception("not authorzied");
var LCA = _db.OrganizationLCAs
.Include(x => x.Comments)
.Where(x => x.ID == LCAID && x.Status == LCAStatus.Processing).Single();
//generate word , excel
//CFT-89
//string sourceFileName = "OrganizationLCADocTemplate.docx";
//string sourceFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", sourceFileName);
//再發送給查證單位之前,客戶未產生報告書和清冊
//所以在發送給查證單位時一同爲他產生
//if(LCA.CarbonFootprintDocxUrl == null && LCA.InterrogationResultUrl ==null)
{
string templatePath;
try
{
templatePath = HttpContext.Current.Server.MapPath("~/Browser_Local/WebFilesRoot");
}
catch
{
templatePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory
, "Browser_Local\\WebFilesRoot");
}
//Logger log = NLog.LogManager.GetCurrentClassLogger();
//log.Info($"OrganizationLCAProcessingToWait templatePath={templatePath}");
templatePath = Path.Combine(templatePath, userName);
string sourceFilePath = "";
//get user's template
var fileFullName = (from u in _db.UserLCADocExcelTemplates
join t in _db.DocExcelTemplates on u.TemplateID equals t.ID
where u.UserID == userID && t.IsDocDefaultTemplate == true
select t.FileName).FirstOrDefault();
//if (fileFullName != null && fileFullName.Trim() != "")
//{
// fileFullName = fileFullName.Substring(1);
// sourceFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileFullName);
//}
//else//用戶未上傳自己的報告書範本,則使用系統默認範本
{
string sourceFileName = CScommon.ProgramConstants.OrganizationWordReport;// "OrganizationLCADocTemplate.docx";
sourceFilePath = Path.Combine(templatePath, sourceFileName);
}
using (var file = System.IO.File.Open(sourceFilePath, FileMode.Open))
using (var cache = new MemoryStream())
using (var excelCache = new MemoryStream())
{
var KgToTon = 0.001m;
var dto = _db.OrganizationLCAs
.Where(x => x.ID == LCAID && x.Status == LCAStatus.Processing)
.Select(x => new OrganizationLCAReportDTO()
{
CompanyName = x.Owner == null ? "" : x.Owner.Name,
FabName = x.TargetFab == null ? "" : x.TargetFab.Name,
FabAddress = x.TargetFab == null ? "" : x.TargetFab.Address,
WorkhourSum = (x.WorkHourSheet.Count == 0 ? 0 : x.WorkHourSheet.Sum(y => y.KgCO2e)) * KgToTon,
PowerSum = (x.PowerUsageSheet.Count == 0 ? 0 : x.PowerUsageSheet.Sum(y => y.KgCO2e)) * KgToTon,
CarSum = (x.VehicleSheet.Count == 0 ? 0 : x.VehicleSheet.Sum(y => y.KgCO2e)) * KgToTon,
GasolineSum = (x.GasolineEquipmentSheet.Count == 0 ? 0 : x.GasolineEquipmentSheet.Sum(y => y.KgCO2e)) * KgToTon,
KitchenSum = (x.KitchenSheet.Count == 0 ? 0 : x.KitchenSheet.Sum(y => y.KgCO2e)) * KgToTon,
FireEQSum = (x.FireEquipmentSheet.Count == 0 ? 0 : x.FireEquipmentSheet.Sum(y => y.KgCO2e)) * KgToTon,
RefSum = (x.RefrigerantSheet.Count == 0 ? 0 : x.RefrigerantSheet.Sum(y => y.KgCO2e)) * KgToTon,
SteamSum = (x.SteamUsageSheet.Count == 0 ? 0 : x.SteamUsageSheet.Sum(y => y.KgCO2e)) * KgToTon,
OthersSum = (x.OtherCompound.Count == 0 ? 0 : x.OtherCompound.Sum(y => y.KgCO2e)) * KgToTon,
ScopeOneTotalValue = ((x.WorkHourSheet.Count == 0 ? 0 : x.WorkHourSheet.Sum(y => y.KgCO2e)) +
(x.VehicleSheet.Count == 0 ? 0 : x.VehicleSheet.Sum(y => y.KgCO2e)) +
(x.GasolineEquipmentSheet.Count == 0 ? 0 : x.GasolineEquipmentSheet.Sum(y => y.KgCO2e)) +
(x.KitchenSheet.Count == 0 ? 0 : x.KitchenSheet.Sum(y => y.KgCO2e)) +
(x.FireEquipmentSheet.Count == 0 ? 0 : x.FireEquipmentSheet.Sum(y => y.KgCO2e)) +
(x.RefrigerantSheet.Count == 0 ? 0 : x.RefrigerantSheet.Sum(y => y.KgCO2e)) +
(x.SteamUsageSheet.Count == 0 ? 0 : x.SteamUsageSheet.Sum(y => y.KgCO2e)) +
(x.OtherCompound.Count == 0 ? 0 : x.OtherCompound.Sum(y => y.KgCO2e)) ) * KgToTon,
ScopeTwoTotalValue = x.PowerUsageSheet.Count == 0 ? 0 : x.PowerUsageSheet.Sum(y => y.KgCO2e) * KgToTon,
Table1Data = x.RefrigerantSheet.Select(y => new OrganizationLCAReportDTO.table1Row()
{
EquipmentName = y.Factor.Type == null ? "" : y.Factor.Type.DisplayNameTW,
RefName = y.Parameter.Type == null ? "" : y.Parameter.Type.DisplayNameTW,
Value = y.Factor == null ? 0 : y.Factor.Value
}).Distinct().ToList(),
CertificationCompanyName = x.VerifyBy == null ? "" : x.VerifyBy.Name
}).Single();//DL-75
makeupDTOfields(dto, userID, LCAID, false);
var duringDate = _db.OrganizationLCAs
.Where(x => x.ID == LCAID && x.Status == LCAStatus.Processing)
.Select(x => new { start = x.StartDate, end = x.EndDate }).Single();
dto.DuringInventory = duringDate.start.ToString("yyyy/MM/dd") + " ~ " + duringDate.end.ToString("yyyy/MM/dd");
var GWPValue = GetGWPValueByLCAID(LCAID);
var qry = (from a in _db.UserAccountType
where a.UserId == userID
select a.tCO2digits).FirstOrDefault();
int digits = 4;
if (qry != null)
digits = (int)qry;
//generate docx
file.CopyTo(cache);
WordprocessingDocument wordDocument = WordprocessingDocument.Open(cache, true);
var parser = new OrganizationLCADocParser(wordDocument);
Dictionary<int, decimal> sixCat = get6categoryKgCO2e(LCAID, false);
decimal baseYearTonCO2e = baseYearLCATonCO2e(LCAID, false);
parser.ReplaceAllTextTagWithData(dto, digits, sixCat, baseYearTonCO2e, GWPValue);
wordDocument.MainDocumentPart.Document.Save();
cache.Seek(0, SeekOrigin.Begin);
//generate 清冊
var excelExporter = new OrganizationLCAExcelExport();
var workbook = excelExporter.CreateWorkbook();
var lcaSheet = excelExporter.CreateSheet(workbook, "清冊");
excelExporter.CreateInsertableArea(lcaSheet, 0, 20, 0, 10);
excelExporter.InsertOrganizationLcaData(workbook, lcaSheet, dto);
workbook.Write(excelCache);
//end
using (var temp = new MemoryStream(excelCache.ToArray()))
{
var storage = GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(Storage.AzureStorage)) as Storage.AzureStorage;
//Start CFT-6
//LCA.CarbonFootprintDocxUrl = storage.SaveToAzure(cache, "CarbonFootprint.docx").ToString();
//LCA.InterrogationResultUrl = storage.SaveToAzure(temp, "Lca_Result.xlsx").ToString();
var CarbonFootprintDocxUrl = storage.SaveToAzure(cache, "CarbonFootprint.docx", baseUrl).ToString();
var InterrogationResultUrl = storage.SaveToAzure(temp, "OrgLca_Result.xlsx", baseUrl).ToString();
//Logger log = NLog.LogManager.GetCurrentClassLogger();
//log.Info($"CarbonFootprintDocxUrl={CarbonFootprintDocxUrl}");
//log.Info($"InterrogationResultUrl={InterrogationResultUrl}");
LCA.CarbonFootprintDocxUrl = CarbonFootprintDocxUrl.Substring(CarbonFootprintDocxUrl.IndexOf("Browser_Local") - 1);
LCA.InterrogationResultUrl = InterrogationResultUrl.Substring(InterrogationResultUrl.IndexOf("Browser_Local") - 1);
//End CFT-6
}
}
}
//update status
LCA.Comments.ToList().ForEach(x => x.IsHistory = true);
LCA.Status = LCAStatus.Waiting;
LCA.StatusHistory.Add(new LCAStatusLog(LCAStatus.Waiting, GetUserContext().Name));
_db.SaveChanges();
//CFT-17
//send eamil to certification company
string CCemail = "";
int companyID = LCA.VerifierCompanyID > 0 ? (int)LCA.VerifierCompanyID : 0;
var userInfo = _db.Users.FirstOrDefault(u => u.CompanyID == companyID);
if (userInfo != null && userInfo.Email != null && userInfo.Email.Trim() != "")
{
CCemail = userInfo.Email.Trim();
service.SendMessageToCertificationCompany(CCemail);
}
//End CFT-17
}
protected Dictionary<int, decimal> get6categoryKgCO2e(int LCAID, bool isRptMerged)
{
Dictionary<int, decimal> ret = new Dictionary<int, decimal>();
orgList6GHGinventoryVM GHGrec;
if (!isRptMerged)
{
orgList6GHGinventoryService _orgList6GHGinventoryService =
new orgList6GHGinventoryService(_db);
GHGrec = _orgList6GHGinventoryService.generateReportData(LCAID);
}
else
{
orgList6GHGinventoryMergeService _orgList6GHGinventoryService =
new orgList6GHGinventoryMergeService(_db);
GHGrec = _orgList6GHGinventoryService.generateReportData(LCAID);
}
ret.Add(1, GHGrec.row10.TOTAL);
ret.Add(2, GHGrec.row20a.TOTAL + GHGrec.row20b.TOTAL);
ret.Add(3, GHGrec.row30.Stotal + GHGrec.row31.Stotal + GHGrec.row32.Stotal
+ GHGrec.row33.Stotal + GHGrec.row34.Stotal + GHGrec.row35.Stotal);
ret.Add(4, GHGrec.row40.Stotal + GHGrec.row41a.Stotal + GHGrec.row41b.Stotal
+ GHGrec.row42.Stotal + GHGrec.row43.Stotal + GHGrec.row44.Stotal
+ GHGrec.row45.Stotal);
ret.Add(5, GHGrec.row50.Stotal + GHGrec.row51.Stotal + GHGrec.row52.Stotal
+ GHGrec.row53.Stotal + GHGrec.row54.Stotal);
ret.Add(6, GHGrec.row6.Stotal);
return ret;
}
protected int getBaseYearLCAID(int LCAID)
{
int ret = 0;
string sql = $@"
select id
from (
select a.ID, a.ID oriID
from LCAs a
where a.isBaseYear=1
union
select b.id, a.ID oriID
from LCAs a
join LCAs b on a.BaseYearLCAID=b.ID
where b.isBaseYear=1
) a
where oriID={LCAID}
";
var qry = _db.Database.SqlQuery<int>(sql).FirstOrDefault();
if (qry != null)
ret = qry;
return ret;
}
/// <summary>
/// 取得某盤查單盤查表總排碳量
/// </summary>
/// <param name="LCAID">目前盤查單號</param>
/// <returns></returns>
protected decimal baseYearLCATonCO2e(int LCAID, bool rptMerged)
{
orgLCAdata1resultVM ret;
excelExportOrgLCAdataVM dataObj;
IexcelExportLCAdataService realData;
int baseYearLCAID = 0;
if (!rptMerged)
{
realData = new excelExportLCAdataService(_db);
baseYearLCAID = getBaseYearLCAID(LCAID);
if (baseYearLCAID == 0)
return 0;
dataObj =
realData.generateReportData(baseYearLCAID);
}
else
{
realData = new excelExportLCAmergeDataService(_db);
baseYearLCAID = getBaseYearLCAID(LCAID);
if (baseYearLCAID == 0)
return 0;
dataObj =
realData.generateReportData(baseYearLCAID);
}
ret = dataObj._orgLCAdata1resultVM;
return ret.totalKgCO2e / 1000;
}
/// <summary>
///
/// </summary>
/// <param name="LCAID"></param>
/// <param name="userID"></param>
/// <param name="userName"></param>
/// <param name="option">0: all, 1: 盤查表, 2: 清冊, 3: 報告書, 4: 風險評估表</param>
/// <returns></returns>
public string OrganizationLCAGenerateReport(WeeeDataContext _db
, string sourceDir, string targetFile, int LCAID
, string userID, string userName, string baseUrl, int option = 0)
{
UserAccountType accountType = _db.UserAccountType.Where(x => x.UserId == userID).FirstOrDefault();
int tCO2digits = (int)(accountType.tCO2digits != null ? accountType.tCO2digits : 4);
bool inWeb = false;
if (string.IsNullOrWhiteSpace(sourceDir) && string.IsNullOrWhiteSpace(targetFile))
{
inWeb = true;
sourceDir = AppDomain.CurrentDomain.BaseDirectory;
}
bool rptLCAdata = true;//盤查表
//bool rptLCAdata = false;//盤查表
bool rptLCAlist = true;//清冊
bool rptLCAreport = true;//報告書
//bool rptLCArisk = false;//風險評估表
bool rptLCArisk = true;//風險評估表
bool rptMerged = false;
switch (option)
{
case 0://all
break;
case 1://盤查表
rptLCAlist = false;
rptLCAreport = false;
rptLCArisk = false;
break;
case 12://合併清冊
rptMerged = true;
rptLCAdata = false;
rptLCAreport = false;
rptLCArisk = false;
break;
case 2://清冊
rptLCAdata = false;
rptLCAreport = false;
rptLCArisk = false;
break;
case 13://合併報告書
rptMerged = true;
rptLCAdata = false;
rptLCAlist = false;
rptLCArisk = false;
break;
case 3://報告書
rptLCAdata = false;
rptLCAlist = false;
rptLCArisk = false;
break;
case 4://風險評估表
rptLCAdata = false;
rptLCAlist = false;
rptLCAreport = false;
break;
default:
break;
}
if (accountType.AccountType == ACCOUNT_TYPE.ORGANICATION12)
rptLCArisk = false;
string templatePath;
try
{
templatePath = HttpContext.Current.Server.MapPath("~/Browser_Local/WebFilesRoot");
}
catch
{
templatePath = Path.Combine(sourceDir, "Browser_Local\\WebFilesRoot");
}
//Logger log = NLog.LogManager.GetCurrentClassLogger();
//log.Info($"OrganizationLCAGenerateReport templatePath={templatePath}");
templatePath = Path.Combine(templatePath, userName);
if (!inWeb && option == 3)
templatePath = sourceDir;
//if (!AuthorizedLCAs.Contains(LCAID))
// throw new Exception("not authorzied");
var LCA = _db.OrganizationLCAs
.Include(x => x.Comments)
.Where(x => x.ID == LCAID //&& x.Status == LCAStatus.Processing
).Single();
var fileFullName = Path.Combine(templatePath
, CScommon.ProgramConstants.OrganizationWordReport);// qry.FirstOrDefault();
var storage = GlobalConfiguration.Configuration.DependencyResolver.GetService(
typeof(Storage.AzureStorage)) as Storage.AzureStorage;
var KgToTon = 0.001m;
OrganizationLCAReportDTO dto;
if (!rptMerged)
{
dto = _db.OrganizationLCAs
.Where(x => x.ID == LCAID
//&& x.Status == LCAStatus.Processing
)
.Select(x => new OrganizationLCAReportDTO()
{
CompanyName = x.Owner == null ? "" : x.Owner.Name,
FabName = x.TargetFab == null ? "" : x.TargetFab.Name,
FabAddress = x.TargetFab == null ? "" : x.TargetFab.Address,
WorkhourSum = (x.WorkHourSheet.Count == 0 ? 0 : x.WorkHourSheet.Sum(y => y.KgCO2e)) * KgToTon,
PowerSum = (x.PowerUsageSheet.Count == 0 ? 0 : x.PowerUsageSheet.Sum(y => y.KgCO2e)) * KgToTon,
CarSum = (x.VehicleSheet.Count == 0 ? 0 : x.VehicleSheet.Sum(y => y.KgCO2e)) * KgToTon,
GasolineSum = (x.GasolineEquipmentSheet.Count == 0 ? 0 : x.GasolineEquipmentSheet.Sum(y => y.KgCO2e)) * KgToTon,
KitchenSum = (x.KitchenSheet.Count == 0 ? 0 : x.KitchenSheet.Sum(y => y.KgCO2e)) * KgToTon,
FireEQSum = (x.FireEquipmentSheet.Count == 0 ? 0 : x.FireEquipmentSheet.Sum(y => y.KgCO2e)) * KgToTon,
RefSum = (x.RefrigerantSheet.Count == 0 ? 0 : x.RefrigerantSheet.Sum(y => y.KgCO2e)) * KgToTon,
SteamSum = (x.SteamUsageSheet.Count == 0 ? 0 : x.SteamUsageSheet.Sum(y => y.KgCO2e)) * KgToTon,
OthersSum = (x.OtherCompound.Count == 0 ? 0 : x.OtherCompound.Sum(y => y.KgCO2e)) * KgToTon,
ScopeOneTotalValue = ((x.WorkHourSheet.Count == 0 ? 0 : x.WorkHourSheet.Sum(y => y.KgCO2e)) +
(x.VehicleSheet.Count == 0 ? 0 : x.VehicleSheet.Sum(y => y.KgCO2e)) +
(x.GasolineEquipmentSheet.Count == 0 ? 0 : x.GasolineEquipmentSheet.Sum(y => y.KgCO2e)) +
(x.KitchenSheet.Count == 0 ? 0 : x.KitchenSheet.Sum(y => y.KgCO2e)) +
(x.FireEquipmentSheet.Count == 0 ? 0 : x.FireEquipmentSheet.Sum(y => y.KgCO2e)) +
(x.RefrigerantSheet.Count == 0 ? 0 : x.RefrigerantSheet.Sum(y => y.KgCO2e)) +
(x.SteamUsageSheet.Count == 0 ? 0 : x.SteamUsageSheet.Sum(y => y.KgCO2e))+
(x.OtherCompound.Count==0 ? 0 : x.OtherCompound.Sum(y => y.KgCO2e)) ) * KgToTon,
ScopeTwoTotalValue = x.PowerUsageSheet.Count == 0 ? 0 : x.PowerUsageSheet.Sum(y => y.KgCO2e) * KgToTon,
Table1Data = x.RefrigerantSheet.Select(y => new OrganizationLCAReportDTO.table1Row()
{
EquipmentName = y.Factor.Type == null ? "" : y.Factor.Type.DisplayNameTW,
RefName = y.Parameter.Type == null ? "" : y.Parameter.Type.DisplayNameTW,
Value = y.Factor == null ? 0 : y.Factor.Value
}).Distinct().ToList(),
CertificationCompanyName = x.VerifyBy == null ? "" : x.VerifyBy.Name
}).Single();//DL-75
makeupDTOfields(dto, userID, LCAID, rptMerged);
//組織邊界設定範圍一覽表
var qryFab = (from a in _db.OrganizationLCAs
join b in _db.Fabs on a.FabID equals b.ID
where a.ID == LCAID
select b).AsQueryable();
if (qryFab.Any())
dto.fabs = qryFab.ToList();
else
dto.fabs = new List<Fab>();
// CFT-263 排放係數管理表
dto.EmitParaMngTableData = new List<OrganizationLCAReportDTO.EmitParaMngTableRow>();
var rowComparer = new OrganizationLCAReportDTO.EmitParaMngTableRowComparer();
dto.EmitParaMngTableData.AddRange(
(from a in _db.LCACommonSurveyForm_PowerUsage
join b in _db.Parameters on a.ParameterID equals b.ID
join c in _db.YearlyParameters on a.ParameterID equals c.ID
join d in _db.YearlyParameterTypes on c.TypeID equals d.ID
where a.LCAID == LCAID
select new { a, b, d }
).ToList().Select(r => new EmitParaMngTableRow(1, "外購電力",
r.b.CO2Value, r.b.CH4Value, r.b.N2OValue, r.b.HFCsValue, r.b.PFCsValue,
r.b.SF6Value, r.b.NF3Value,
r.d.DisplayNameTW, r.d.paraSource,
"公噸{gasName}/千度",
"能源局公告109年電力係數", 2, "外購電力")).Distinct(rowComparer)
);
dto.EmitParaMngTableData.AddRange(
(from a in _db.LCACommonSurveyForm_FireEquipment
//join b in _db.Parameters on a.ParameterID equals b.ID
//join c in _db.NonYearlyParameters on a.ParameterID equals c.ID
//join d in _db.NonYearlyParameterTypes on c.TypeID equals d.ID
join b in _db.AssessmentReportGWP on a.ARnGWPid equals b.ID
join d in _db.LCAs on a.LCAID equals d.ID
where a.LCAID == LCAID
select new { a, b, d }
).ToList().Select(r => new EmitParaMngTableRow(2, r.a.Name,
r.b.CO2Value(r.d.ARversion), r.b.CH4Value(r.d.ARversion), r.b.N2OValue(r.d.ARversion),
r.b.HFCsValue(r.d.ARversion), r.b.PFCsValue(r.d.ARversion),
r.b.SF6Value(r.d.ARversion), r.b.NF3Value(r.d.ARversion),
r.b.ingredientName, r.b.paraSource,
"公噸{gasName}/公噸",
CScommon.ProgramConstants.ipccAR6, 1, "逸散 (F)")).Distinct(rowComparer)
);
dto.EmitParaMngTableData.AddRange(
(from a in _db.LCACommonSurveyForm_GasolineEquipment
join b in _db.Parameters on a.ParameterID equals b.ID
join c in _db.YearlyParameters on a.ParameterID equals c.ID
join d in _db.YearlyParameterTypes on c.TypeID equals d.ID
where a.LCAID == LCAID && d.warmGasType == WarmGasType.
select new { a, b, d }
).ToList().Select(r => new EmitParaMngTableRow(3, r.a.Name,
r.b.CO2Value, r.b.CH4Value, r.b.N2OValue, r.b.HFCsValue, r.b.PFCsValue,
r.b.SF6Value, r.b.NF3Value,
r.d.DisplayNameTW, r.d.paraSource,
"公噸{gasName}/公秉",
CScommon.ProgramConstants.ipccAR6, 1, "固定 (E)")).Distinct(rowComparer)
);
dto.EmitParaMngTableData.AddRange(
(from a in _db.LCACommonSurveyForm_Kitchen
join b in _db.Parameters on a.ParameterID equals b.ID
join c in _db.YearlyParameters on a.ParameterID equals c.ID
join d in _db.YearlyParameterTypes on c.TypeID equals d.ID
where a.LCAID == LCAID && d.warmGasType == WarmGasType.
select new { a, b, d }
).ToList().Select(r => new EmitParaMngTableRow(4, r.a.Name,
r.b.CO2Value, r.b.CH4Value, r.b.N2OValue, r.b.HFCsValue, r.b.PFCsValue,
r.b.SF6Value, r.b.NF3Value,
r.d.DisplayNameTW, r.d.paraSource,
"公噸{gasName}/公秉",
CScommon.ProgramConstants.ipccAR6, 1, "製程 (P)")).Distinct(rowComparer)
);
dto.EmitParaMngTableData.AddRange(
(from a in _db.LCACommonSurveyForm_Kitchen
join b in _db.Parameters on a.ParameterID equals b.ID
join c in _db.YearlyParameters on a.ParameterID equals c.ID
join d in _db.YearlyParameterTypes on c.TypeID equals d.ID
where a.LCAID == LCAID && d.warmGasType == WarmGasType.
select new { a, b, d }
).ToList().Select(r => new EmitParaMngTableRow(4, r.a.Name,
r.b.CO2Value, r.b.CH4Value, r.b.N2OValue, r.b.HFCsValue, r.b.PFCsValue,
r.b.SF6Value, r.b.NF3Value,
r.d.DisplayNameTW, r.d.paraSource,
"公噸{gasName}/公秉",
CScommon.ProgramConstants.ipccAR6, 1, "固定 (E)")).Distinct(rowComparer)
);
dto.EmitParaMngTableData.AddRange(
(from a in _db.LCACommonSurveyForm_Refrigerant
//join b in _db.Parameters on a.ParameterID equals b.ID
//join c in _db.NonYearlyParameters on a.ParameterID equals c.ID
//join d in _db.NonYearlyParameterTypes on c.TypeID equals d.ID
join b in _db.AssessmentReportGWP on a.ARnGWPid equals b.ID
join d in _db.LCAs on a.LCAID equals d.ID
where a.LCAID == LCAID
select new { a, b, d }
).ToList().Select(r => new EmitParaMngTableRow(5, r.a.Name,
r.b.CO2Value(r.d.ARversion), r.b.CH4Value(r.d.ARversion), r.b.N2OValue(r.d.ARversion),
r.b.HFCsValue(r.d.ARversion), r.b.PFCsValue(r.d.ARversion),
r.b.SF6Value(r.d.ARversion), r.b.NF3Value(r.d.ARversion),
r.b.ingredientName, r.b.paraSource,
"公噸{gasName}/公噸",
CScommon.ProgramConstants.ipccAR6, 1, "逸散 (F)")).Distinct(rowComparer)
);
dto.EmitParaMngTableData.AddRange(
(from a in _db.LCACommonSurveyForm_Vehicle
join b in _db.Parameters on a.ParameterID equals b.ID
join c in _db.YearlyParameters on a.ParameterID equals c.ID
join d in _db.YearlyParameterTypes on c.TypeID equals d.ID
where a.LCAID == LCAID
select new { a, b, d }
).ToList().Select(r => new EmitParaMngTableRow(6, r.a.Name,
r.b.CO2Value, r.b.CH4Value, r.b.N2OValue, r.b.HFCsValue, r.b.PFCsValue,
r.b.SF6Value, r.b.NF3Value,
r.d.DisplayNameTW, r.d.paraSource,
"公噸{gasName}/公秉",
CScommon.ProgramConstants.ipccAR6, 1, "移動 (T)")).Distinct(rowComparer)
);
}
else//合併報表
{
var qry = _db.OrganizationLCAs
.Where(x => x.parentLCAID == LCAID
//&& x.Status == LCAStatus.Processing
)
.Select(x => new OrganizationLCAReportDTO()
{
CompanyName = x.Owner == null ? "" : x.Owner.Name,
FabName = x.TargetFab == null ? "" : x.TargetFab.Name,
FabAddress = x.TargetFab == null ? "" : x.TargetFab.Address,
WorkhourSum = (x.WorkHourSheet.Count == 0 ? 0 : x.WorkHourSheet.Sum(y => y.KgCO2e)) * KgToTon,
PowerSum = (x.PowerUsageSheet.Count == 0 ? 0 : x.PowerUsageSheet.Sum(y => y.KgCO2e)) * KgToTon,
CarSum = (x.VehicleSheet.Count == 0 ? 0 : x.VehicleSheet.Sum(y => y.KgCO2e)) * KgToTon,
GasolineSum = (x.GasolineEquipmentSheet.Count == 0 ? 0 : x.GasolineEquipmentSheet.Sum(y => y.KgCO2e)) * KgToTon,
KitchenSum = (x.KitchenSheet.Count == 0 ? 0 : x.KitchenSheet.Sum(y => y.KgCO2e)) * KgToTon,
FireEQSum = (x.FireEquipmentSheet.Count == 0 ? 0 : x.FireEquipmentSheet.Sum(y => y.KgCO2e)) * KgToTon,
RefSum = (x.RefrigerantSheet.Count == 0 ? 0 : x.RefrigerantSheet.Sum(y => y.KgCO2e)) * KgToTon,
SteamSum = (x.SteamUsageSheet.Count == 0 ? 0 : x.SteamUsageSheet.Sum(y => y.KgCO2e)) * KgToTon,
OthersSum = (x.OtherCompound.Count == 0 ? 0 : x.OtherCompound.Sum(y => y.KgCO2e)) * KgToTon,
ScopeOneTotalValue = ((x.WorkHourSheet.Count == 0 ? 0 : x.WorkHourSheet.Sum(y => y.KgCO2e)) +
(x.VehicleSheet.Count == 0 ? 0 : x.VehicleSheet.Sum(y => y.KgCO2e)) +
(x.GasolineEquipmentSheet.Count == 0 ? 0 : x.GasolineEquipmentSheet.Sum(y => y.KgCO2e)) +
(x.KitchenSheet.Count == 0 ? 0 : x.KitchenSheet.Sum(y => y.KgCO2e)) +
(x.FireEquipmentSheet.Count == 0 ? 0 : x.FireEquipmentSheet.Sum(y => y.KgCO2e)) +
(x.RefrigerantSheet.Count == 0 ? 0 : x.RefrigerantSheet.Sum(y => y.KgCO2e)) +
(x.SteamUsageSheet.Count == 0 ? 0 : x.SteamUsageSheet.Sum(y => y.KgCO2e)) +
(x.OtherCompound.Count == 0 ? 0 : x.OtherCompound.Sum(y => y.KgCO2e)) ) * KgToTon,
ScopeTwoTotalValue = x.PowerUsageSheet.Count == 0 ? 0 : x.PowerUsageSheet.Sum(y => y.KgCO2e) * KgToTon,
Table1Data = x.RefrigerantSheet.Select(y => new OrganizationLCAReportDTO.table1Row()
{
EquipmentName = y.Factor.Type == null ? "" : y.Factor.Type.DisplayNameTW,
RefName = y.Parameter.Type == null ? "" : y.Parameter.Type.DisplayNameTW,
Value = y.Factor == null ? 0 : y.Factor.Value
}).Distinct().ToList(),
CertificationCompanyName = x.VerifyBy == null ? "" : x.VerifyBy.Name
}).AsQueryable();//DL-75
var qry2 = qry.ToList();
dto = new OrganizationLCAReportDTO();
foreach (var rec in qry2)
{
dto.CompanyName = string.IsNullOrWhiteSpace(rec.CompanyName) ? "" : rec.CompanyName;
dto.FabName = string.IsNullOrWhiteSpace(rec.FabName) ? "" : rec.FabName;
dto.FabAddress = string.IsNullOrWhiteSpace(rec.FabAddress) ? "" : rec.FabAddress;
dto.WorkhourSum += rec.WorkhourSum;
dto.PowerSum += rec.PowerSum;
dto.CarSum += rec.CarSum;
dto.GasolineSum += rec.GasolineSum;
dto.KitchenSum += rec.KitchenSum;
dto.FireEQSum += rec.FireEQSum;
dto.RefSum += rec.RefSum;
dto.SteamSum += rec.SteamSum;
dto.OthersSum+= rec.OthersSum;
dto.ScopeOneTotalValue += rec.ScopeOneTotalValue;
dto.ScopeTwoTotalValue += rec.ScopeTwoTotalValue;
dto.CertificationCompanyName = string.IsNullOrWhiteSpace(rec.CertificationCompanyName) ? "" : rec.CertificationCompanyName;
if (dto.Table1Data == null) dto.Table1Data = new List<table1Row>();
foreach (var rec2 in rec.Table1Data)
dto.Table1Data.Add(rec2);
}
makeupDTOfields(dto, userID, LCAID, rptMerged);
//組織邊界設定範圍一覽表
var qryFab = (from a in _db.LCAs
join b in _db.OrganizationLCAs on a.ID equals b.ID
join c in _db.Fabs on b.FabID equals c.ID
where a.parentLCAID == LCAID
select c).AsQueryable();
if (qryFab.Any())
dto.fabs = qryFab.ToList();
else
dto.fabs = new List<Fab>();
// CFT-263 排放係數管理表
dto.EmitParaMngTableData = new List<OrganizationLCAReportDTO.EmitParaMngTableRow>();
var rowComparer = new OrganizationLCAReportDTO.EmitParaMngTableRowComparer();
//const string ipccAR6 = @"IPCC AR6係數";
const string ipccAR6 = @"溫室氣體排放係數管理表6.0.4版";
dto.EmitParaMngTableData.AddRange(
(from a in _db.LCACommonSurveyForm_PowerUsage
join b in _db.Parameters on a.ParameterID equals b.ID
join c in _db.YearlyParameters on a.ParameterID equals c.ID
join d in _db.YearlyParameterTypes on c.TypeID equals d.ID
join e in _db.LCAs on a.LCAID equals e.ID
where e.parentLCAID == LCAID
select new { a, b, d }
).ToList().Select(r => new EmitParaMngTableRow(1, "外購電力", r.b.CO2Value, r.b.CH4Value, r.b.N2OValue, r.b.HFCsValue, r.b.PFCsValue,
r.b.SF6Value, r.b.NF3Value,
r.d.DisplayNameTW, r.d.paraSource,
"公噸{gasName}/千度",
"能源局公告109年電力係數", 2, "外購電力")).Distinct(rowComparer)
);
dto.EmitParaMngTableData.AddRange(
(from a in _db.LCACommonSurveyForm_FireEquipment
//join b in _db.Parameters on a.ParameterID equals b.ID
//join c in _db.NonYearlyParameters on a.ParameterID equals c.ID
//join d in _db.NonYearlyParameterTypes on c.TypeID equals d.ID
join b in _db.AssessmentReportGWP on a.ARnGWPid equals b.ID
join d in _db.LCAs on a.LCAID equals d.ID
where d.parentLCAID == LCAID
select new { a, b, d }
).ToList().Select(r => new EmitParaMngTableRow(2, r.a.Name,
r.b.CO2Value(r.d.ARversion), r.b.CH4Value(r.d.ARversion), r.b.N2OValue(r.d.ARversion),
r.b.HFCsValue(r.d.ARversion), r.b.PFCsValue(r.d.ARversion),
r.b.SF6Value(r.d.ARversion), r.b.NF3Value(r.d.ARversion),
r.b.ingredientName, r.b.paraSource,
"公噸{gasName}/公噸",
ipccAR6, 1, "逸散 (F)")).Distinct(rowComparer)
);
dto.EmitParaMngTableData.AddRange(
(from a in _db.LCACommonSurveyForm_GasolineEquipment
join b in _db.Parameters on a.ParameterID equals b.ID
join c in _db.YearlyParameters on a.ParameterID equals c.ID
join d in _db.YearlyParameterTypes on c.TypeID equals d.ID
join e in _db.LCAs on a.LCAID equals e.ID
where e.parentLCAID == LCAID && d.warmGasType == WarmGasType.
select new { a, b, d }
).ToList().Select(r => new EmitParaMngTableRow(3, r.a.Name,
r.b.CO2Value, r.b.CH4Value, r.b.N2OValue, r.b.HFCsValue, r.b.PFCsValue,
r.b.SF6Value, r.b.NF3Value,
r.d.DisplayNameTW, r.d.paraSource,
"公噸{gasName}/公秉",
ipccAR6, 1, "固定 (E)")).Distinct(rowComparer)
);
dto.EmitParaMngTableData.AddRange(
(from a in _db.LCACommonSurveyForm_Kitchen
join b in _db.Parameters on a.ParameterID equals b.ID
join c in _db.YearlyParameters on a.ParameterID equals c.ID
join d in _db.YearlyParameterTypes on c.TypeID equals d.ID
join e in _db.LCAs on a.LCAID equals e.ID
where e.parentLCAID == LCAID && d.warmGasType == WarmGasType.
select new { a, b, d }
).ToList().Select(r => new EmitParaMngTableRow(4, r.a.Name,
r.b.CO2Value, r.b.CH4Value, r.b.N2OValue, r.b.HFCsValue, r.b.PFCsValue,
r.b.SF6Value, r.b.NF3Value,
r.d.DisplayNameTW, r.d.paraSource,
"公噸{gasName}/公秉",
ipccAR6, 1, "製程 (P)")).Distinct(rowComparer)
);
dto.EmitParaMngTableData.AddRange(
(from a in _db.LCACommonSurveyForm_Kitchen
join b in _db.Parameters on a.ParameterID equals b.ID
join c in _db.YearlyParameters on a.ParameterID equals c.ID
join d in _db.YearlyParameterTypes on c.TypeID equals d.ID
join e in _db.LCAs on a.LCAID equals e.ID
where e.parentLCAID == LCAID && d.warmGasType == WarmGasType.
select new { a, b, d }
).ToList().Select(r => new EmitParaMngTableRow(4, r.a.Name,
r.b.CO2Value, r.b.CH4Value, r.b.N2OValue, r.b.HFCsValue, r.b.PFCsValue,
r.b.SF6Value, r.b.NF3Value,
r.d.DisplayNameTW, r.d.paraSource,
"公噸{gasName}/公秉",
ipccAR6, 1, "固定 (E)")).Distinct(rowComparer)
);
dto.EmitParaMngTableData.AddRange(
(from a in _db.LCACommonSurveyForm_Refrigerant
//join b in _db.Parameters on a.ParameterID equals b.ID
//join c in _db.NonYearlyParameters on a.ParameterID equals c.ID
//join d in _db.NonYearlyParameterTypes on c.TypeID equals d.ID
join b in _db.AssessmentReportGWP on a.ARnGWPid equals b.ID
join d in _db.LCAs on a.LCAID equals d.ID
where d.parentLCAID == LCAID
select new { a, b, d }
).ToList().Select(r => new EmitParaMngTableRow(5, r.a.Name,
r.b.CO2Value(r.d.ARversion), r.b.CH4Value(r.d.ARversion), r.b.N2OValue(r.d.ARversion),
r.b.HFCsValue(r.d.ARversion), r.b.PFCsValue(r.d.ARversion),
r.b.SF6Value(r.d.ARversion), r.b.NF3Value(r.d.ARversion),
r.b.ingredientName, r.b.paraSource,
"公噸{gasName}/公噸",
ipccAR6, 1, "逸散 (F)")).Distinct(rowComparer)
);
dto.EmitParaMngTableData.AddRange(
(from a in _db.LCACommonSurveyForm_Vehicle
join b in _db.Parameters on a.ParameterID equals b.ID
join c in _db.YearlyParameters on a.ParameterID equals c.ID
join d in _db.YearlyParameterTypes on c.TypeID equals d.ID
join e in _db.LCAs on a.LCAID equals e.ID
where e.parentLCAID == LCAID
select new { a, b, d }
).ToList().Select(r => new EmitParaMngTableRow(6, r.a.Name,
r.b.CO2Value, r.b.CH4Value, r.b.N2OValue, r.b.HFCsValue, r.b.PFCsValue,
r.b.SF6Value, r.b.NF3Value,
r.d.DisplayNameTW, r.d.paraSource,
"公噸{gasName}/公秉",
ipccAR6, 1, "移動 (T)")).Distinct(rowComparer)
);
}
// (外購能源上游生產) 外購電力CO2 公噸 / 千度此項例外資料庫沒有固定是0.0923,就如範例中固定加入到最後一項
dto.EmitParaMngTableData.Add(new EmitParaMngTableRow()
{
Order = 7,
EquipmentName = "外購能源 上游生產 (電)",
ParameterTypeName = "外購電力",
CO2Value = 0.0923000000M,
Unit = "公噸{gasName}/千度",
InfoSource = "碳足跡計算服務平台",
EmitSourceCategory = 4,
EmitSourceType = "外購電力 上游"
});
dto.EmitParaMngTableData = dto.EmitParaMngTableData.Distinct().ToList();
var duringDate = _db.OrganizationLCAs
.Where(x => x.ID == LCAID //&& x.Status == LCAStatus.Processing
)
.Select(x => new { start = x.StartDate, end = x.EndDate }).Single();
//報告書
string companyName = CompanyNameByLCAID(LCAID);
if (rptLCAreport && fileFullName != null && fileFullName.Trim() != "")
{
//fileFullName = fileFullName.Substring(1);
string sourceFilePath = Path.Combine(sourceDir, fileFullName);
var qry = (from a in _db.UserAccountType
where a.UserId == userID
select a.tCO2digits).FirstOrDefault();
int digits = 4;
if (qry != null)
digits = (int)qry;
//Logger log = NLog.LogManager.GetCurrentClassLogger();
//log.Error("App_Error", context.Exception);
//log.Info($"OrganizationLCAGenerateReport sourceFilePath={sourceFilePath}");
using (var file = System.IO.File.Open(sourceFilePath, FileMode.Open))
using (var wordMemoryStream = new MemoryStream())
{
dto.DuringInventory = duringDate.start.ToString("yyyy/MM/dd") + " ~ " + duringDate.end.ToString("yyyy/MM/dd");
{
file.CopyTo(wordMemoryStream);
WordprocessingDocument wordDocument = WordprocessingDocument.Open(wordMemoryStream, true);
var parser = new OrganizationLCADocParser(wordDocument);
//實際變更報告書內容處
//rptMerged 合併報告書
Dictionary<int, decimal> sixCat = get6categoryKgCO2e(LCAID, rptMerged);
decimal baseYearTonCO2e = baseYearLCATonCO2e(LCAID, rptMerged);
var GWPValue = GetGWPValueByLCAID(LCAID);
parser.ReplaceAllTextTagWithData(dto, digits, sixCat, baseYearTonCO2e,GWPValue);
wordDocument.MainDocumentPart.Document.Save();
wordMemoryStream.Seek(0, SeekOrigin.Begin);
//IexcelExportLCAdataService realData;
//realData = new excelExportLCAdataService(_db);
//excelExportOrgLCAdataVM dataObj =
// realData.generateReportData(LCAID);
string filename = $"{companyName}_報告書{LCAID}.docx";
if (inWeb)
{
var CarbonFootprintDocxUrl = storage.SaveToAzure(wordMemoryStream, filename, baseUrl, userName).ToString();
//Logger log = NLog.LogManager.GetCurrentClassLogger();
//log.Info($"CarbonFootprintDocxUrl 2={CarbonFootprintDocxUrl}");
LCA.CarbonFootprintDocxUrl = CarbonFootprintDocxUrl.Substring(CarbonFootprintDocxUrl.IndexOf("Browser_Local") - 1);
}
else
{
FileStream fs = new FileStream(targetFile, FileMode.Create, FileAccess.Write);
wordMemoryStream.WriteTo(fs);
fs.Close();
LCA.CarbonFootprintDocxUrl = "";
}
}
}
}
//產生清冊
if (rptLCAlist)
{
_adminCheckService = new adminCheckService(_db, userID);
_companyAdminCheckService = new companyAdminCheckService(_db, userID);
if (!_adminCheckService.adminCheckPass())//若未能規避權限控管檢查
{
try
{
AdminAccess aa = _adminCheckService.getAdminAccess();
if (aa == null)
throw new Exception("伺服器尚未匯入金鑰,請洽系統管理員處理");
int listReportQuantity = _adminCheckService.getListReportQuantity();
if (listReportQuantity >= aa.listReportLimit && aa.listReportLimit != -1)
throw new Exception(
$"盤查清冊數({listReportQuantity})已達或超過全站限制" +
$"({aa.listReportLimit}),請系統管理員更新金鑰限制重新匯入");
companyAdminAccessVM uaaVM = _companyAdminCheckService
.getCompanyAdminAccessVM(
_companyAdminCheckService.userId2companyID(userID));
int listReportQuantityByUserId =
_companyAdminCheckService.getListReportQuantityByUserId(userID);
if (listReportQuantityByUserId >= uaaVM.listReportLimit
&& uaaVM.listReportLimit != -1)
throw new Exception($"盤查清冊數({listReportQuantityByUserId})已達或超過公司限制" +
$"({uaaVM.listReportLimit}),請公司管理員更新限制重新嘗試");
}
catch (Exception ex)
{
log.Error(ex);
log.Error(CScommon.Exceptions.inner(ex));
log.Error(ex.StackTrace);
throw;
}
}
// 產生盤查表 Thomas Mao
string reportTemplateRootPath;
reportTemplateRootPath = Path.Combine(templatePath, CScommon.ProgramConstants.OrganizationExcelList);
if (!File.Exists(reportTemplateRootPath))
throw new Exception($"{userName} {CScommon.ProgramConstants.OrganizationExcelList}不存在!");
XLWorkbook workBook;
if (!rptMerged)
{
IexcelExportOrgListWrapper reportWrapper
= new excelExportOrgListWrapper(templatePath);
IexcelExportOrgListService realData;
realData = new excelExportOrgListService(_db);
excelExportOrgListVM dataObj;
dataObj = realData.generateReportData(LCAID);
dataObj._orgList2CalculationVM.tCO2digits = tCO2digits;
dataObj._orgList4UncertaintyVMdomestic.tCO2digits = tCO2digits;
dataObj._orgList4UncertaintyVMforeign.tCO2digits = tCO2digits;
dataObj._orgList5DataQualityVM.tCO2digits = tCO2digits;
dataObj._orgList6GHGinventoryVM.tCO2digits = tCO2digits;
workBook = reportWrapper.generateReport(dataObj);
}
else
{
IexcelExportOrgMergeListService realData;
IexcelExportOrgMergeListWrapper reportWrapper
= new excelExportOrgMergeListWrapper(templatePath);
realData = new excelExportOrgMergeListService(_db);
excelExportOrgMergeListVM dataObj;
dataObj = realData.generateReportData(LCAID);
if (dataObj._orgList2CalculationLstVM != null)
{
foreach (var rec in dataObj._orgList2CalculationLstVM)
rec.tCO2digits = tCO2digits;
}
dataObj._orgList4UncertaintyVMdomestic.tCO2digits = tCO2digits;
dataObj._orgList4UncertaintyVMforeign.tCO2digits = tCO2digits;
dataObj._orgList5DataQualityVM.tCO2digits = tCO2digits;
dataObj._orgList6GHGinventoryVM.tCO2digits = tCO2digits;
workBook = reportWrapper.generateReport(dataObj);
}
using (var LCAdataMemoryStream = new MemoryStream())
{
workBook.SaveAs(LCAdataMemoryStream);
// 更新清冊url Thomas Mao
using (var LCAdataRptMS = new MemoryStream(LCAdataMemoryStream.ToArray()))
{
var InterrogationResultUrl = storage.SaveToAzure(LCAdataRptMS
, $"{companyName}_清冊{LCAID}.xlsx", baseUrl, userName).ToString();
//Logger log = NLog.LogManager.GetCurrentClassLogger();
//log.Info($"InterrogationResultUrl={InterrogationResultUrl}");
LCA.InterrogationResultUrl = InterrogationResultUrl.Substring(
InterrogationResultUrl.IndexOf("Browser_Local") - 1);
LCA.listReportGeneratedTime = DateTime.Now;
}
}
}
//產生盤查表
if (rptLCAdata)
{
// 產生盤查表 Thomas Mao
string reportTemplateRootPath;
reportTemplateRootPath = Path.Combine(templatePath, CScommon.ProgramConstants.OrganizationExcelLCAdata);
if (!File.Exists(reportTemplateRootPath))
throw new Exception($"{userName} {CScommon.ProgramConstants.OrganizationExcelLCAdata}不存在!");
IexcelExportLCAdataWrapper reportWrapper
= new excelExportLCAdataWrapper(templatePath);
IexcelExportLCAdataService realData;
realData = new excelExportLCAdataService(_db);
excelExportOrgLCAdataVM dataObj =
realData.generateReportData(LCAID);
dataObj._orgLCAdata1resultVM.tCO2digits = tCO2digits;
XLWorkbook workBook = reportWrapper.generateReport(dataObj);
using (var LCAdataMemoryStream = new MemoryStream())
{
workBook.SaveAs(LCAdataMemoryStream);
// 更新盤查表url Thomas Mao
using (var LCAdataRptMS = new MemoryStream(LCAdataMemoryStream.ToArray()))
{
var LCAdataRptUrl = storage.SaveToAzure(LCAdataRptMS, $"{companyName}_盤查表{LCAID}.xlsx", baseUrl, userName).ToString();
LCA.LCAdataRptUrl = LCAdataRptUrl.Substring(LCAdataRptUrl.IndexOf("Browser_Local") - 1);
}
}
}
//產生風險評估報表
if (rptLCArisk)
{
string reportTemplateRootPath;
reportTemplateRootPath = Path.Combine(templatePath, CScommon.ProgramConstants.OrganizationExcelLCArisk); //風險評估表
if (!File.Exists(reportTemplateRootPath))
throw new Exception($"{userName} {CScommon.ProgramConstants.OrganizationExcelLCArisk}不存在!");
IexcelExportLCAriskWrapper reportWrapper
= new excelExportLCAriskWrapper(templatePath);
IexcelExportLCAriskService realData;
realData = new excelExportLCAriskService(_db);
excelExportOrgLCAriskVM dataObj =
realData.generateReportData(LCAID);
dataObj._orgLCArisk1lifeCycleVM.tCO2digits = tCO2digits;
dataObj._orgLCArisk4listContentVM.tCO2digits = tCO2digits;
XLWorkbook workBook = reportWrapper.generateReport(dataObj);
workBook.Worksheet("生命週期流程圖及評估").Cell($"B2").Value = $"{companyName}產品生命週期流程圖";
using (var LCAriskMemoryStream = new MemoryStream())
{
workBook.SaveAs(LCAriskMemoryStream);
using (var LCAriskRptMS = new MemoryStream(LCAriskMemoryStream.ToArray()))
{
var LCAriskRptUrl = storage.SaveToAzure(LCAriskRptMS, $"{companyName}_風險評估表{LCAID}.xlsx", baseUrl, userName).ToString();
LCA.LCAriskRptUrl = LCAriskRptUrl.Substring(LCAriskRptUrl.IndexOf("Browser_Local") - 1);
}
}
}
//End CFT-6
_db.SaveChanges();
if (!inWeb && option == 3)
return "";
string url = "";
string actPath = System.Web.HttpContext.Current.Request.Url.Authority;
//string fullPath = HttpContext.Current.Request.Url.ToString();
string protocolName;// = fullPath.Substring(0, fullPath.IndexOf("//") + 2);
if (HttpContext.Current.Request.IsSecureConnection)
protocolName = "https://";
else
protocolName = "http://";
actPath = protocolName + actPath;
//ILog log = LogManager.GetLogger(typeof(MvcApplication));
//log.Info($"WeeeLCADataService OrganizationLCAGenerateReport actPath={actPath}");
//log.Info($"IsSecureConnection={HttpContext.Current.Request.IsSecureConnection}");
log.Info($"org report baseUrl={baseUrl} actPath={actPath}");
if (LCA.InterrogationResultUrl != null)
{
if (rptLCAlist)
url = actPath + baseUrl + LCA.InterrogationResultUrl.Trim();
if (rptLCAreport && LCA.CarbonFootprintDocxUrl != null)
{
if (!string.IsNullOrWhiteSpace(url))
url += ",";
url += actPath + baseUrl + LCA.CarbonFootprintDocxUrl;
}
}
else
{
if (rptLCAreport && LCA.CarbonFootprintDocxUrl != null)
{
url = actPath + baseUrl + LCA.CarbonFootprintDocxUrl.Trim();
}
}
if (rptLCAdata)
{
if (!string.IsNullOrWhiteSpace(url))
url += ",";
url += actPath + baseUrl + LCA.LCAdataRptUrl;
}
if (rptLCArisk)
{
if (!string.IsNullOrWhiteSpace(url))
url += ",";
url += actPath + baseUrl + LCA.LCAriskRptUrl;
}
return url;
}
//產品型盤查表
public string ProductLCAdataGenerateReport(WeeeDataContext _db
, string sourceDir, string targetFile, int LCAID
, string userID, string userName, string baseUrl)
{
string url = "";
string companyName = CompanyNameByLCAID(LCAID);
UserAccountType accountType = _db.UserAccountType.Where(x => x.UserId == userID).FirstOrDefault();
int tCO2digits = (int)(accountType.tCO2digits != null ? accountType.tCO2digits : 4);
bool inWeb = false;
if (string.IsNullOrWhiteSpace(sourceDir) && string.IsNullOrWhiteSpace(targetFile))
{
inWeb = true;
sourceDir = AppDomain.CurrentDomain.BaseDirectory;
}
string templatePath;
try
{
templatePath = HttpContext.Current.Server.MapPath("~/Browser_Local/WebFilesRoot");
}
catch
{
templatePath = Path.Combine(sourceDir, "Browser_Local\\WebFilesRoot");
}
//Logger log = NLog.LogManager.GetCurrentClassLogger();
//log.Info($"OrganizationLCAGenerateReport templatePath={templatePath}");
templatePath = Path.Combine(templatePath, userName);
if (!inWeb )//&& option == 3)
templatePath = sourceDir;
var LCA = _db.ProductLCAs//.OrganizationLCAs
.Include(x => x.Comments)
.Where(x => x.ID == LCAID //&& x.Status == LCAStatus.Processing
).Single();
var fileFullName = Path.Combine(templatePath
, CScommon.ProgramConstants.OrganizationWordReport);// qry.FirstOrDefault();
var storage = GlobalConfiguration.Configuration.DependencyResolver.GetService(
typeof(Storage.AzureStorage)) as Storage.AzureStorage;
// 產生盤查表 Thomas Mao
string reportTemplateRootPath;
reportTemplateRootPath = Path.Combine(templatePath, CScommon.ProgramConstants.ProductExcelLCAdata);
if (!File.Exists(reportTemplateRootPath))
throw new Exception($"{userName} {CScommon.ProgramConstants.OrganizationExcelLCAdata}不存在!");
IexcelExportProdLCAdataService realData;
IexcelExportProdLCAdataWrapper reportWrapper;
realData = new excelExportProdLCAdataService(_db);
reportWrapper = new excelExportProdLCAdataWrapper(templatePath);
excelExportProdLCAdataVM dataObj =
realData.generateReportData(LCAID);
//dataObj._orgLCAdata1resultVM.tCO2digits = tCO2digits;
XLWorkbook workBook = reportWrapper.generateReport(dataObj);
using (var LCAdataMemoryStream = new MemoryStream())
{
workBook.SaveAs(LCAdataMemoryStream);
// 更新盤查表url Thomas Mao
using (var LCAdataRptMS = new MemoryStream(LCAdataMemoryStream.ToArray()))
{
var LCAdataRptUrl = storage.SaveToAzure(LCAdataRptMS, $"{companyName}_產品盤查表{LCAID}.xlsx", baseUrl, userName).ToString();
LCA.LCAdataRptUrl = LCAdataRptUrl.Substring(LCAdataRptUrl.IndexOf("Browser_Local") - 1);
}
}
var protocolName = "";
if (HttpContext.Current.Request.IsSecureConnection)
protocolName = "https://";
else
protocolName = "http://";
string actPath = System.Web.HttpContext.Current.Request.Url.Authority;
actPath = protocolName + actPath;
url = actPath + baseUrl + LCA.LCAdataRptUrl;
return url;
}
//產品型清冊
public string ProductListGenerateReport(WeeeDataContext _db
, string sourceDir, string targetFile, int LCAID
, string userID, string userName, string baseUrl)
{
string url = "";
string companyName = CompanyNameByLCAID(LCAID);
UserAccountType accountType = _db.UserAccountType.Where(x => x.UserId == userID).FirstOrDefault();
int tCO2digits = (int)(accountType.tCO2digits != null ? accountType.tCO2digits : 4);
bool inWeb = false;
if (string.IsNullOrWhiteSpace(sourceDir) && string.IsNullOrWhiteSpace(targetFile))
{
inWeb = true;
sourceDir = AppDomain.CurrentDomain.BaseDirectory;
}
string templatePath;
try
{
templatePath = HttpContext.Current.Server.MapPath("~/Browser_Local/WebFilesRoot");
}
catch
{
templatePath = Path.Combine(sourceDir, "Browser_Local\\WebFilesRoot");
}
//Logger log = NLog.LogManager.GetCurrentClassLogger();
//log.Info($"OrganizationLCAGenerateReport templatePath={templatePath}");
templatePath = Path.Combine(templatePath, userName);
if (!inWeb)//&& option == 3)
templatePath = sourceDir;
var LCA = _db.ProductLCAs//.OrganizationLCAs
.Include(x => x.Comments)
.Where(x => x.ID == LCAID //&& x.Status == LCAStatus.Processing
).Single();
var fileFullName = Path.Combine(templatePath
, CScommon.ProgramConstants.OrganizationWordReport);// qry.FirstOrDefault();
var storage = GlobalConfiguration.Configuration.DependencyResolver.GetService(
typeof(Storage.AzureStorage)) as Storage.AzureStorage;
// 產生盤查表 Thomas Mao
string reportTemplateRootPath;
reportTemplateRootPath = Path.Combine(templatePath, CScommon.ProgramConstants.ProductExcelList);
if (!File.Exists(reportTemplateRootPath))
throw new Exception($"{userName} {CScommon.ProgramConstants.OrganizationExcelLCAdata}不存在!");
IexcelExportProdListService realData;
IexcelExportProdListWrapper reportWrapper;
realData = new excelExportProdListService(_db);
reportWrapper = new excelExportProdListWrapper(templatePath);
excelExportProdListVM dataObj =
realData.generateReportData(LCAID);
//dataObj._orgLCAdata1resultVM.tCO2digits = tCO2digits;
XLWorkbook workBook = reportWrapper.generateReport(dataObj);
using (var LCAdataMemoryStream = new MemoryStream())
{
workBook.SaveAs(LCAdataMemoryStream);
// 更新盤查表url Thomas Mao
using (var LCAdataRptMS = new MemoryStream(LCAdataMemoryStream.ToArray()))
{
var LCAdataRptUrl = storage.SaveToAzure(LCAdataRptMS, $"{companyName}_產品清冊{LCAID}.xlsx", baseUrl, userName).ToString();
LCA.LCAdataRptUrl = LCAdataRptUrl.Substring(LCAdataRptUrl.IndexOf("Browser_Local") - 1);
}
}
var protocolName = "";
if (HttpContext.Current.Request.IsSecureConnection)
protocolName = "https://";
else
protocolName = "http://";
string actPath = System.Web.HttpContext.Current.Request.Url.Authority;
actPath = protocolName + actPath;
url = actPath + baseUrl+ LCA.LCAdataRptUrl;
return url;
}
//敏感度分析
public string ProductSensitivityGenerateReport(WeeeDataContext _db
, string sourceDir, string targetFile, int LCAID
, string userID, string userName, string baseUrl)
{
string url = "";
string companyName = CompanyNameByLCAID(LCAID);
UserAccountType accountType = _db.UserAccountType.Where(x => x.UserId == userID).FirstOrDefault();
int tCO2digits = (int)(accountType.tCO2digits != null ? accountType.tCO2digits : 4);
bool inWeb = false;
if (string.IsNullOrWhiteSpace(sourceDir) && string.IsNullOrWhiteSpace(targetFile))
{
inWeb = true;
sourceDir = AppDomain.CurrentDomain.BaseDirectory;
}
string templatePath;
try
{
templatePath = HttpContext.Current.Server.MapPath("~/Browser_Local/WebFilesRoot");
}
catch
{
templatePath = Path.Combine(sourceDir, "Browser_Local\\WebFilesRoot");
}
//Logger log = NLog.LogManager.GetCurrentClassLogger();
//log.Info($"OrganizationLCAGenerateReport templatePath={templatePath}");
templatePath = Path.Combine(templatePath, userName);
if (!inWeb)//&& option == 3)
templatePath = sourceDir;
var LCA = _db.ProductLCAs//.OrganizationLCAs
.Include(x => x.Comments)
.Where(x => x.ID == LCAID //&& x.Status == LCAStatus.Processing
).Single();
var fileFullName = Path.Combine(templatePath
, CScommon.ProgramConstants.OrganizationWordReport);// qry.FirstOrDefault();
var storage = GlobalConfiguration.Configuration.DependencyResolver.GetService(
typeof(Storage.AzureStorage)) as Storage.AzureStorage;
string reportTemplateRootPath;
reportTemplateRootPath = Path.Combine(templatePath, CScommon.ProgramConstants.ProductSensitivity);
if (!File.Exists(reportTemplateRootPath))
throw new Exception($"{userName} {CScommon.ProgramConstants.OrganizationExcelLCAdata}不存在!");
IExcelExportProdSensitivityService realData;
IexcelExportProdSensitivityWrapper reportWrapper;
realData = new ExcelExportProdSensitivityService(_db);
reportWrapper = new excelExportProdSensitivityWrapper(templatePath);
excelExportProdSensitivityVM dataObj =
realData.generateReportData(LCAID);
//dataObj._orgLCAdata1resultVM.tCO2digits = tCO2digits;
XLWorkbook workBook = reportWrapper.generateReport(dataObj);
using (var LCAdataMemoryStream = new MemoryStream())
{
workBook.SaveAs(LCAdataMemoryStream);
// 更新url
using (var LCAdataRptMS = new MemoryStream(LCAdataMemoryStream.ToArray()))
{
var LCAdataRptUrl = storage.SaveToAzure(LCAdataRptMS, $"{companyName}_敏感性分析{LCAID}.xlsx", baseUrl, userName).ToString();
LCA.LCAdataRptUrl = LCAdataRptUrl.Substring(LCAdataRptUrl.IndexOf("Browser_Local") - 1);
}
}
var protocolName = "";
if (HttpContext.Current.Request.IsSecureConnection)
protocolName = "https://";
else
protocolName = "http://";
string actPath = System.Web.HttpContext.Current.Request.Url.Authority;
actPath = protocolName + actPath;
url = actPath + baseUrl + LCA.LCAdataRptUrl;
return url;
}
internal void SaveCertificationZipFile(int LCAID, string filePath)
{
var LCA = _db.LCAs.Where(x => x.ID == LCAID).Single();
if(LCA != null)
{
LCA.CertificationFeedbackZipUrl = filePath;
_db.SaveChanges();
}
}
public void OrganizationLCAWaitToRejected(int LCAID)
{
if (CurrentCompany.CompanyType != typeof(CertificationCompany)) throw new Exception("this action is only avaliable for CertificationCompany");
if (!AuthorizedLCAs.Contains(LCAID)) throw new Exception("not authorzied");
var LCA = _db.OrganizationLCAs.Where(x => x.ID == LCAID && (x.Status == LCAStatus.Waiting || x.Status==LCAStatus.Completed)).Include(x => x.Comments).Single();
LCA.Status = LCAStatus.Rejected;
LCA.StatusHistory.Add(new LCAStatusLog(LCAStatus.Rejected, GetUserContext().Name));
// LCA.Comments.ToList().ForEach(x => x.IsHistory = true);
_db.SaveChanges();
}
public void OrganizationLCARejectedToProcessing(int LCAID)
{
if (!AuthorizedLCAs.Contains(LCAID)) throw new Exception("not authorzied");
var LCA = _db.OrganizationLCAs.Where(x => x.ID == LCAID && x.Status == LCAStatus.Rejected).Include(x => x.Comments).Single();
LCA.Status = LCAStatus.Processing;
LCA.StatusHistory.Add(new LCAStatusLog(LCAStatus.Processing, GetUserContext().Name));
_db.SaveChanges();
}
public void OrganizationLCAWaitToConfirmed(int LCAID)
{
if (CurrentCompany.CompanyType != typeof(CertificationCompany)) throw new Exception("this action is only avaliable for CertificationCompany");
if (!AuthorizedLCAs.Contains(LCAID)) throw new Exception("not authorzied");
var LCA = _db.OrganizationLCAs.Where(x => x.ID == LCAID && x.Status == LCAStatus.Waiting).Single();
LCA.Status = LCAStatus.Confirmed;
LCA.StatusHistory.Add(new LCAStatusLog(LCAStatus.Confirmed, GetUserContext().Name));
LCA.Comments.ToList().ForEach(x => x.IsHistory = true);
_db.SaveChanges();
}
public void OrganizationLCAConfirmedToCompleted(int LCAID)
{
if (!AuthorizedLCAs.Contains(LCAID)) throw new Exception("not authorzied");
var LCA = _db.OrganizationLCAs.Where(x => x.ID == LCAID && x.Status == LCAStatus.Confirmed).Single();
LCA.Status = LCAStatus.Completed;
LCA.StatusHistory.Add(new LCAStatusLog(LCAStatus.Completed, GetUserContext().Name));
_db.SaveChanges();
}
public void OrganizationLCANewToCompleted(int LCAID)
{
if (!AuthorizedLCAs.Contains(LCAID)) throw new Exception("not authorzied");
var LCA = _db.OrganizationLCAs.Where(x => x.ID == LCAID && x.Status == LCAStatus.New).Single();
LCA.Status = LCAStatus.Completed;
LCA.StatusHistory.Add(new LCAStatusLog(LCAStatus.Completed, GetUserContext().Name));
_db.SaveChanges();
}
/// <summary>
/// 盤查單位拒絕擔任該盤查單之盤查單位
/// </summary>
/// <param name="LCAID"></param>
public void LCARefuse(int LCAID)
{
if (!AuthorizedLCAs.Contains(LCAID)) throw new Exception("not authorzied");
var LCA = _db.LCAs.Where(x => x.ID == LCAID).Single();
LCA.VerifierCompanyID = null;
_db.SaveChanges();
}
public void LcaChangeScheduledVerificationDate(int LCAID, DateTime? scheduledVerificationDate = null)
{
if (!AuthorizedLCAs.Contains(LCAID)) throw new Exception("not authorzied");
var LCA = _db.LCAs.Where(x => x.ID == LCAID).Single();
LCA.ScheduledVerificationDate = scheduledVerificationDate;
_db.SaveChanges();
}
public bool CheckOrganizationBaseYearIsCorrect(OrganizationLCA lca, string userID)
{
// 是否為基準年
if (!lca.isBaseYear)
{
// 非基準年的話,確認基準年盤查單的建立者是否為本人,且必須勾選為基準年
if (!_db.LCAs.Where(x => x.UserId == userID && lca.BaseYearLCAID == x.ID && x.isBaseYear).Any())
return false;
}
return true;
}
#endregion
#region Get list
public IEnumerable<ProductLCAReplyRequest> GetReceivedRequests(string userName)//DL-50
{
var replyRequests = _db.ProductLCAReplyRequests
.Include(x => x.RepliedByWhichLCA)
.Include(x => x.SentByWhichMaterial)
.Where(x => x.ReceiverCompanyID == CurrentCompany.ID)
;
//.ToList();
var qry = replyRequests
.Where(x => x.SentByWhichMaterial.SupplierCompanyName.ToLower().Trim() == userName.ToLower().Trim())
.AsQueryable();
var result = qry
.OrderByDescending(x => x.CreatedDate)
//.ThenBy(x => x.SentByWhichMaterial.PartNumber)
.ToList();
return result;
//end
}
public IEnumerable<LCA> GetLCAs(string UserId="")
{
IEnumerable<LCA> ret;
if (UserId=="")
ret = _db.LCAs
.Where(x => x.OwnerID == CurrentCompany.ID)
.OrderByDescending(x => x.ID)
.ToList();
else
ret = _db.LCAs
.Where(x => x.UserId == UserId)
.OrderByDescending(x => x.ID)
.ToList();
//Start CFT-54
int userType = UserAccountType != null ? (int)UserAccountType.AccountType : 0;
//if(userType != 2)
//{
// ret = (from r in ret
// where !(from pl in _db.ProductLCAs select pl.ID).Contains(r.ID)
// select r).ToList();
//}
//End CFT-54
return ret;
}
//DL-51
public IEnumerable<LCA> GetLCAsForUser(string UserName)
{
//根据log获取当前用户创建的盘查
var logs = (from log in _db.LCAStatusLogs where log.WhoDidThis.Trim().ToLower() == UserName.Trim().ToLower()
group log by log.LCA into rg select
(from l in rg orderby l.ID ascending select l).FirstOrDefault());//.ToList();
var result = (from lca in _db.LCAs.Local
join l in logs on lca.ID equals l.LCAID
select lca).ToList();
//if (!string.IsNullOrWhiteSpace(userID))
//{
// result = result.Where(x => x.UserId == userID);
// return result.ToList();
//}
//Start CFT-54
int userType = UserAccountType != null ? (int) UserAccountType.AccountType : 0;
//if (userType != 2)
//{
// result = (from r in result
// where !(from pl in _db.ProductLCAs select pl.ID).Contains(r.ID)
// select r).ToList();
//}
//End CFT-54
return result;
}
//DL-51
public IEnumerable<ProductLCAReplyRequest> GetRequestForUser(string UserName, string Name, IEnumerable<ProductLCAReplyRequest> sendRequests)
{
//根据log获取当前用户发送的盘查指令
var logs = (from log in _db.LCAStatusLogs
where (log.WhoDidThis.Trim().ToLower() == UserName.Trim().ToLower() || log.WhoDidThis.Trim().ToLower() == Name.Trim().ToLower())
group log by log.LCA into rg
select (from l in rg orderby l.ID ascending select l).FirstOrDefault()).ToList();
var result = (from r in sendRequests
join m in _db.ProductLCAProductSurveyForm_Material.Local on r.ID equals m.ID
join l in logs on m.LCAID equals l.LCAID
select r).ToList();
return result;
}
#endregion
#region Get and Save detail
public Type GetLCAType(int id)
{
return _db.LCAs.Find(id).LCAType;
}
public LCA GetLCA(int id)
{
if (AuthorizedLCAs.Contains(id))
{
LCA ret = _db.LCAs.Find(id);
if (string.IsNullOrWhiteSpace(ret.ListDefaultPurpose))
ret.ListDefaultPurpose = CScommon.ProgramConstants.LIST_DEFAULT_PURPOSE;
return ret;
}
throw new Exception("not authorized");
}
public ProductLCA GetProductLCA(int id)
{
if (AuthorizedLCAs.Contains(id))
{
return _db.ProductLCAs.Find(id);
}
throw new Exception("not authorized");
}
public ProductLCA GetProductLCAWithInclude(int id)
{
if (AuthorizedLCAs.Contains(id))
{
return _db.ProductLCAs.Include(x => x.Materials)
.Include(x => x.Materials.Select(y => y.AssignedParameter))
.Include(x => x.Materials.Select(y => y.AssignedParameterType))
.Include(x => x.Materials.Select(y => y.RequestSent.ReceiveBy))
.Include(x => x.WorkHourSheet)
.Include(x => x.PowerUsageSheet)
.Include(x => x.WaterUsageSheet)
.Include(x => x.WasteSheet)
.Include(x => x.WasteSheet.Select(y => y.Parameter))
.Include(x => x.WasteSheet.Select(y => y.Parameter.Type))
.Include(x => x.TransportSheet)
.Include(x => x.TransportSheet.Select(y => y.NonYearlyParameter))
.Include(x => x.TransportSheet.Select(y => y.NonYearlyParameter.Type))
.Include(x => x.WasteTransportSheet)
//.Include(x => x.WasteTransportSheet.Select(y => y.Parameter))
//.Include(x => x.WasteTransportSheet.Select(y => y.Parameter.Type))
.Include(x => x.VehicleSheet)
.Include(x => x.VehicleSheet.Select(y => y.Parameter))
.Include(x => x.VehicleSheet.Select(y => y.Parameter.Area))
.Include(x => x.VehicleSheet.Select(y => y.Parameter.Type))
.Include(x => x.GasolineEquipmentSheet)
.Include(x => x.GasolineEquipmentSheet.Select(y => y.Parameter))
.Include(x => x.GasolineEquipmentSheet.Select(y => y.Parameter.Area))
.Include(x => x.GasolineEquipmentSheet.Select(y => y.Parameter.Type))
.Include(x => x.KitchenSheet)
.Include(x => x.KitchenSheet.Select(y => y.Parameter))
.Include(x => x.KitchenSheet.Select(y => y.Parameter.Area))
.Include(x => x.KitchenSheet.Select(y => y.Parameter.Type))
.Include(x => x.RefrigerantSheet)
.Include(x => x.RefrigerantSheet.Select(y => y.Parameter))
.Include(x => x.RefrigerantSheet.Select(y => y.Parameter.Type))
.Include(x => x.RefrigerantSheet.Select(y => y.Factor))
.Include(x => x.RefrigerantSheet.Select(y => y.Factor.Type))
.Include(x => x.FireEquipmentSheet)
.Include(x => x.FireEquipmentSheet.Select(y => y.Parameter))
.Include(x => x.FireEquipmentSheet.Select(y => y.Parameter.Type))
.Include(x => x.SteamUsageSheet)
.Include(x => x.SteamUsageSheet.Select(y => y.Parameter))
.Include(x => x.SteamUsageSheet.Select(y => y.Parameter.Type))
.Include(x => x.OtherCompoundSheet)
.Include(x => x.OtherCompoundSheet.Select(y => y.Parameter))
.Include(x => x.OtherCompoundSheet.Select(y => y.Parameter.Type))
.Where(x => x.ID == id).Single();
}
throw new Exception("not authroized");
}
public OrganizationLCA GetOrganizationLCA(int id)
{
if (AuthorizedLCAs.Contains(id))
{
return _db.OrganizationLCAs.Find(id);
}
throw new Exception("not authorized");
}
public OrganizationLCA GetOrganizationLCAWithInclude(int id)
{
if (AuthorizedLCAs.Contains(id))
{
return _db.OrganizationLCAs
.Include(x => x.PowerUsageSheet)
.Include(x => x.VehicleSheet)
.Include(x => x.VehicleSheet.Select(y => y.Parameter))
.Include(x => x.VehicleSheet.Select(y => y.Parameter.Area))
.Include(x => x.VehicleSheet.Select(y => y.Parameter.Type))
.Include(x => x.RefrigerantSheet)
.Include(x => x.RefrigerantSheet.Select(y => y.Parameter))
.Include(x => x.RefrigerantSheet.Select(y => y.Parameter.Type))
.Include(x => x.RefrigerantSheet.Select(y => y.Factor))
.Include(x => x.RefrigerantSheet.Select(y => y.Factor.Type))
.Include(x => x.SteamUsageSheet)
.Include(x => x.SteamUsageSheet.Select(y => y.Parameter))
.Include(x => x.SteamUsageSheet.Select(y => y.Parameter.Type))
.Where(x => x.ID == id).Single();
}
throw new Exception("not authroized");
}
public bool isOrgLCA(int LCAID)
{
bool ret = false;
var qry = (from a in _db.LCAs
join b in _db.OrganizationLCAs on a.ID equals b.ID
where a.ID == LCAID
select a.ID).FirstOrDefault();
if (qry != null && qry>0)
ret = true;
return ret;
}
public bool isProdLCA(int LCAID)
{
bool ret = false;
var qry = (from a in _db.LCAs
join b in _db.ProductLCAs on a.ID equals b.ID
where a.ID == LCAID
select a.ID).FirstOrDefault();
if (qry != null && qry>0)
ret = true;
return ret;
}
public decimal[] GetRptLCAdata(int LCAID)
{
IexcelExportLCAdataService realData;
realData = new excelExportLCAdataService(_db);
excelExportOrgLCAdataVM dataObj = realData.generateReportData(LCAID);
var ret = new decimal[] {0, 0, 0, 0, 0};
if (!isOrgLCA(LCAID))
return ret;
//固定式燃燒之直接排放
ret[0] = dataObj._orgLCAdata1resultVM.fuels固定KgCO2e;
//移動式燃燒之直接排放
ret[1] = dataObj._orgLCAdata1resultVM.fuels移動KgCO2e;
//工業製程之直接排放量及移除量
ret[2] = dataObj._orgLCAdata1resultVM.fuels製程KgCO2e;
//人為系統中釋放之溫室氣體的直接逸散性排放
ret[3] = dataObj._orgLCAdata1resultVM.workHrKgCO2e+ dataObj._orgLCAdata1resultVM.rfgKgCO2e + dataObj._orgLCAdata1resultVM.fireKgCO2e + dataObj._orgLCAdata1resultVM.othersKgCO2e;
//土地使用、土地使用變更和林業的直接排放和移除
ret[4] = 0;
return ret;
}
public decimal[] GetRptList(int LCAID)
{
IexcelExportOrgListService realData;
realData = new excelExportOrgListService(_db);
excelExportOrgListVM dataObj = realData.generateReportData(LCAID);
//var data = (from l in _db.LCARiskAssmtSurveyForm_LifecycleAssmts
// where l.category != null && l.GHGinventoryItemNo != null && l.LCAID == LCAID
// group l by l.category into g
// select new { category = g.Key, sum = g.Sum(x=>x.EmissionT)}).ToList();
// select sum(EmissionKg), category
//from LCARiskAssmtSurveyForm_LifecycleAssmt
//where category is not null and GHGinventoryItemNo is not null
// and LCAID = 494
//group by category
//order by category
var ret = new decimal[] { 0, 0, 0, 0, 0, 0};
if (!isOrgLCA(LCAID))
return ret;
//第一類排放
ret[0] = dataObj._orgList6GHGinventoryVM.row10.TOTAL;
//第二類排放
ret[1] = //dataObj._orgList6GHGinventoryVM.row21.CO2 + dataObj._orgList6GHGinventoryVM.row22.CO2;
dataObj._orgList6GHGinventoryVM.row21.TOTAL+ dataObj._orgList6GHGinventoryVM.row22.TOTAL;
//第三類排放
ret[2] = //data.Where(x => x.category == "3").Any() ? data.Where(x => x.category == "3").First().sum : (decimal)0.00;
dataObj._orgList6GHGinventoryVM.row31.Stotal + dataObj._orgList6GHGinventoryVM.row32.Stotal
+ dataObj._orgList6GHGinventoryVM.row33.Stotal + dataObj._orgList6GHGinventoryVM.row34.Stotal
+ dataObj._orgList6GHGinventoryVM.row35.Stotal;
//第四類排放
ret[3] = //data.Where(x => x.category == "4").Any() ? data.Where(x => x.category == "4").First().sum : (decimal)0.00;
dataObj._orgList6GHGinventoryVM.row41a.Stotal + dataObj._orgList6GHGinventoryVM.row41b.Stotal
+ dataObj._orgList6GHGinventoryVM.row42.Stotal + dataObj._orgList6GHGinventoryVM.row43.Stotal
+ dataObj._orgList6GHGinventoryVM.row44.Stotal + dataObj._orgList6GHGinventoryVM.row45.Stotal;
//第五類排放
ret[4] = //data.Where(x => x.category == "5").Any() ? data.Where(x => x.category == "5").First().sum : (decimal)0.00;
dataObj._orgList6GHGinventoryVM.row51.Stotal + dataObj._orgList6GHGinventoryVM.row52.Stotal
+ dataObj._orgList6GHGinventoryVM.row53.Stotal + dataObj._orgList6GHGinventoryVM.row54.Stotal;
//第六類排放
ret[5] = //data.Where(x => x.category == "6").Any() ? data.Where(x => x.category == "6").First().sum : (decimal)0.00;
dataObj._orgList6GHGinventoryVM.row6.Stotal;
return ret;
}
public string RecalculateProductLCA(int LCAID, bool dueToARchange )
{
string err = "";
// 如果AR4-6版本變更那麼
// 若ARversion為null那麼parameterID來自於Nonyearlyparameter
// 反之則parameterID來自AssessmentReportGWP然後由ARversionGuid去AssessmentReportVersion抓出新的parameterID
// 然後再重算
// RecalculateProductLCA
Org12RecalculateService o12rs = new Org12RecalculateService(_db);
err = o12rs.proceedRecalculate(LCAID);
if (!string.IsNullOrWhiteSpace(err))
return err;
ProdRecalculateService prs= new ProdRecalculateService(_db);
err = prs.proceedRecalculate(LCAID);
return err;
}
public ProductLCA SaveProductLCA(ProductLCA ToBeSave)
{
ToBeSave.OwnerID = CurrentCompany.ID;
if (ToBeSave.ARversion == null)
ToBeSave.ARversion = "AR6";
var entry = _db.Entry(ToBeSave);
bool recalculate = false;
if (ToBeSave.ID == 0)
{
//business logic , if pcrid is null means that this lca do not need to send Request to others
//therefore we assign status to processing , rather then using the status update api to do this task
//if (ToBeSave.PCRID == null) ToBeSave.Status = LCAStatus.Processing;
if (ToBeSave.PCRID == null) ToBeSave.Status = LCAStatus.New;
entry.State = EntityState.Added;
}
else if (AuthorizedLCAs.Contains(ToBeSave.ID))
{
var lcastatus = _db.ProductLCAs
.Where(x => x.ID == ToBeSave.ID)
.Select(x => x.Status)
.FirstOrDefault();
var ARversion = _db.ProductLCAs
.Where(x => x.ID == ToBeSave.ID)
.Select(x => x.ARversion)
.FirstOrDefault();
if (ARversion!=ToBeSave.ARversion)
recalculate = true;
if (lcastatus == LCAStatus.New || lcastatus == LCAStatus.Processing)
{
entry.State = EntityState.Modified;
entry.Property(x => x.LCAStarter).IsModified = true;
entry.Property(x => x.LCAStarterDepartment).IsModified = true;
entry.Property(x => x.LCAStarterJob).IsModified = true;
entry.Property(x => x.LCAStarterPhone).IsModified = true;
entry.Property(x => x.LCAStarterEmail).IsModified = true;
entry.Property(x => x.FabProductionArea).IsModified = true;
entry.Property(x => x.FabProductionHour).IsModified = true;
entry.Property(x => x.ProductProductionPcs).IsModified = true;
entry.Property(x => x.ProductProductionHour).IsModified = true;
entry.Property(x => x.FabProductionWeight).IsModified = true;
entry.Property(x => x.Description).IsModified = true;
entry.Property(x => x.VerifierCompanyID).IsModified = true;
entry.Property(x => x.parentLCAID).IsModified = true;
entry.Property(x => x.ProductAllocationFireEquipment).IsModified = true;
entry.Property(x => x.ProductProductionEconomic).IsModified = true;
entry.Property(x => x.ProductAllocationWorkHour).IsModified = true;
entry.Property(x => x.ProductAllocationPowerUsage).IsModified = true;
entry.Property(x => x.ProductAllocationWaterUsage).IsModified = true;
entry.Property(x => x.ProductAllocationWaste).IsModified = true;
entry.Property(x => x.ProductAllocationWasteWater).IsModified = true;
entry.Property(x => x.ProductAllocationWasteTransport).IsModified = true;
entry.Property(x => x.ProductAllocationVehicle).IsModified = true;
entry.Property(x => x.ProductAllocationGasolineEquipment).IsModified = true;
entry.Property(x => x.ProductAllocationKitchen).IsModified = true;
entry.Property(x => x.ProductAllocationFireEquipment).IsModified = true;
entry.Property(x => x.ProductAllocationRefrigerant).IsModified = true;
entry.Property(x => x.ProductAllocationSteamUsage).IsModified = true;
entry.Property(x => x.ProductAllocationOtherCompound).IsModified = true;
entry.Property(x => x.ProductAllocationTransportUpstream).IsModified = true;
entry.Property(x => x.ProductAllocationTransportDownstream).IsModified = true;
entry.Property(x=>x.ARversion).IsModified = true;
}
}
_db.SaveChanges();
string err = "";
if (recalculate)
{
err = RecalculateProductLCA(ToBeSave.ID, true);
if (!string.IsNullOrWhiteSpace(err))
throw new Exception(err);
}
return ToBeSave;
}
public string RecalculateOrganizationLCA(int LCAID, bool dueToARchange)
{
string err = "";
// 如果AR4-6版本變更那麼
// 若ARversion為null那麼parameterID來自於Nonyearlyparameter
// 反之則parameterID來自AssessmentReportGWP然後由ARversionGuid去AssessmentReportVersion抓出新的parameterID
// 然後再重算
// RecalculateOrganizationLCA
Org12RecalculateService o12rs = new Org12RecalculateService(_db);
err = o12rs.proceedRecalculate(LCAID);
if (!string.IsNullOrWhiteSpace(err))
return err;
Org36RecalculateService o36rs = new Org36RecalculateService(_db);
err = o36rs.proceedRecalculate(LCAID);
return err;
}
public OrganizationLCA SaveOrganizationLCA(OrganizationLCA ToBeSave)
{
ToBeSave.OwnerID = CurrentCompany.ID;
//ToBeSave.LCAStarterUserName = UserName;//CFT-25
var entry = _db.Entry(ToBeSave);
if (ToBeSave.ARversion == null)
ToBeSave.ARversion = "AR6";
bool recalculate = false;
bool isAdd = false;
if (ToBeSave.ID == 0)
{
//Company.HasLCAs.Add(ToBeCreated);
ToBeSave.Status = LCAStatus.Processing;
entry.State = EntityState.Added;
isAdd = true;
}
else if (AuthorizedLCAs.Contains(ToBeSave.ID))
{
var lcastatus = _db.OrganizationLCAs
.Where(x => x.ID == ToBeSave.ID)
.Select(x => x.Status)
.FirstOrDefault();
var ARversion = _db.OrganizationLCAs
.Where(x => x.ID == ToBeSave.ID)
.Select(x => x.ARversion)
.FirstOrDefault();
if (ARversion != ToBeSave.ARversion)
recalculate = true;
if (lcastatus == LCAStatus.New || lcastatus == LCAStatus.Processing)
{
entry.State = EntityState.Modified;
entry.Property(x => x.Status).IsModified = false;
entry.Property(x => x.FabID).IsModified = false;
//entry.Property(x => x.VerifierCompanyID).IsModified = false; // CFT-833
entry.Property(x => x.StartDate).IsModified = false;
entry.Property(x => x.EndDate).IsModified = false;
entry.Property(x => x.CreatedDate).IsModified = false;
entry.Property(x => x.parentLCAID).IsModified = true;
entry.Property(x=>x.ARversion).IsModified = true;
}
}
_db.SaveChanges();
if (isAdd)
{
var defaultFactors = GetDefaultAssmtFactor(ToBeSave.ID);
_db.LCARiskAssmtSurveyForm_AssmtFactors.AddRange(defaultFactors);
_db.SaveChanges();
}
string err = "";
if (recalculate)
{
err = RecalculateOrganizationLCA(ToBeSave.ID, true);
if (!string.IsNullOrWhiteSpace(err))
throw new Exception(err);
}
return ToBeSave;
}
public List<LCARiskAssmtSurveyForm_AssmtFactor> GetDefaultAssmtFactor(int LCAID)
{
var ret = new List<LCARiskAssmtSurveyForm_AssmtFactor>();
ret.Add(new LCARiskAssmtSurveyForm_AssmtFactor() { LCAID = LCAID, FactorName = Resource.DefaultAssmtFactor1 });
ret[0].FactorScores.Add(new LCARiskAssmtSurveyForm_AssmtFactorScore() { OptionDescription = Resource.DefaultAssmtFactorScore1_1, OptionScore = 10 });
ret[0].FactorScores.Add(new LCARiskAssmtSurveyForm_AssmtFactorScore() { OptionDescription = Resource.DefaultAssmtFactorScore1_2, OptionScore = 5 });
ret[0].FactorScores.Add(new LCARiskAssmtSurveyForm_AssmtFactorScore() { OptionDescription = Resource.DefaultAssmtFactorScore1_3, OptionScore = 1 });
ret.Add(new LCARiskAssmtSurveyForm_AssmtFactor() { LCAID = LCAID, FactorName = Resource.DefaultAssmtFactor2 });
ret[1].FactorScores.Add(new LCARiskAssmtSurveyForm_AssmtFactorScore() { OptionDescription = Resource.DefaultAssmtFactorScore2_1, OptionScore = 10 });
ret[1].FactorScores.Add(new LCARiskAssmtSurveyForm_AssmtFactorScore() { OptionDescription = Resource.DefaultAssmtFactorScore2_2, OptionScore = 5 });
ret[1].FactorScores.Add(new LCARiskAssmtSurveyForm_AssmtFactorScore() { OptionDescription = Resource.DefaultAssmtFactorScore2_3, OptionScore = 1 });
ret.Add(new LCARiskAssmtSurveyForm_AssmtFactor() { LCAID = LCAID, FactorName = Resource.DefaultAssmtFactor3 });
ret[2].FactorScores.Add(new LCARiskAssmtSurveyForm_AssmtFactorScore() { OptionDescription = Resource.DefaultAssmtFactorScore3_1, OptionScore = 10 });
ret[2].FactorScores.Add(new LCARiskAssmtSurveyForm_AssmtFactorScore() { OptionDescription = Resource.DefaultAssmtFactorScore3_2, OptionScore = 5 });
ret[2].FactorScores.Add(new LCARiskAssmtSurveyForm_AssmtFactorScore() { OptionDescription = Resource.DefaultAssmtFactorScore3_3, OptionScore = 1 });
ret.Add(new LCARiskAssmtSurveyForm_AssmtFactor() { LCAID = LCAID, FactorName = Resource.DefaultAssmtFactor4 });
ret[3].FactorScores.Add(new LCARiskAssmtSurveyForm_AssmtFactorScore() { OptionDescription = Resource.DefaultAssmtFactorScore4_1, OptionScore = 5 });
ret[3].FactorScores.Add(new LCARiskAssmtSurveyForm_AssmtFactorScore() { OptionDescription = Resource.DefaultAssmtFactorScore4_2, OptionScore = 3 });
ret[3].FactorScores.Add(new LCARiskAssmtSurveyForm_AssmtFactorScore() { OptionDescription = Resource.DefaultAssmtFactorScore4_3, OptionScore = 1 });
ret.Add(new LCARiskAssmtSurveyForm_AssmtFactor() { LCAID = LCAID, FactorName = Resource.DefaultAssmtFactor5 });
ret[4].FactorScores.Add(new LCARiskAssmtSurveyForm_AssmtFactorScore() { OptionDescription = Resource.DefaultAssmtFactorScore5_1, OptionScore = 5 });
ret[4].FactorScores.Add(new LCARiskAssmtSurveyForm_AssmtFactorScore() { OptionDescription = Resource.DefaultAssmtFactorScore5_2, OptionScore = 1 });
return ret;
}
public IEnumerable<ProductLCAProductSurveyForm_Materials> GetMaterials(string userName)//DL-49 DL-50
{
//var supplier = _db.Suppliers.FirstOrDefault(x => x.Name.ToLower().Trim() == userName.ToLower().Trim());
var materials = _db.ProductLCAProductSurveyForm_Material.Where(x => x.SupplierCompanyName.ToLower().Trim() == userName.ToLower().Trim()).ToList();
return materials;
}
#endregion
#region For reply request
public ProductLCAReplyRequest ApplyRepliedRequest(Guid requestID)
{
var request = _db.ProductLCAReplyRequests
.Include(x => x.SentByWhichMaterial.OwnerLCA)
.Where(x => x.Uid == requestID)
.Single();
var material = request.SentByWhichMaterial;
var lca = material.OwnerLCA;
if (!AuthorizedLCAs.Contains(request.SendLCAID)) throw new Exception("not auhtorized");
if (request.CanBeApply && lca.Status == LCAStatus.Processing)
{
material.oriKgCO2e = material.KgCO2e;
//material.oriHighLevelAnalyzeResult = material.HighLevelAnalyzeResult;
material.modifyTime = DateTime.Now;
material.ParameterValue = request.RepliedValue.Value;
material.KgCO2e = material.ActivityIntensity * material.ParameterValue;
material.KgCO2e_BOM = material.ActivityIntensity_BOM * material.ParameterValue;
material.ParameterSource = 1;
// 如果回覆盤查的帳號是自己或是自己的子帳號,就會顯示”特定廠址數據”。
if (lca.OwnerID == request.ReceiverCompanyID )
material.ParameterSource = 3;
//material.HighLevelAnalyzeResult = request.RepliedValue.Value* material.Quantity;
request.AcceptReplyDate = DateTime.Now;
_db.SaveChanges();
}
return request;
}
public ProductLCAReplyRequest ReplyRequest(Guid RequestID, int LCAID, ProductLCAReplyRequest.DivideByOptions divideby)
//public ProductLCAReplyRequest ReplyRequest(Guid RequestID, int LCAID)
{
if (AuthorizedLCAs.Contains(LCAID))
{
var request = _db.ProductLCAReplyRequests
.Where(x => x.Uid == RequestID && x.ReceiverCompanyID == CurrentCompany.ID)
.Single();
var lca = _db.ProductLCAs.Find(LCAID);
if (request.CanBeReplied && lca.CanReplyOtherRequest)
{
// 用來計算單位個數的排碳量
decimal ratio = lca.ProductProductionPcs > 0 ? (decimal)lca.ProductProductionPcs : 1;
//if (divideby == ProductLCAReplyRequest.DivideByOptions.byWeight)
//{
// request.RepliedValue = lca.DistributeKgCO2eInWeight / ratio;
//}
//else if (divideby == ProductLCAReplyRequest.DivideByOptions.byArea)
//{
// request.RepliedValue = lca.DistributeKgCO2eInArea / ratio;
//}
//else if (divideby == ProductLCAReplyRequest.DivideByOptions.byWorkHour)
//{
// request.RepliedValue = lca.DistributeKgCO2eInWorkHour / ratio;
//}
// 不需要再額外選統一的分配方式 而是依照各功能各自的分配方式做計算
request.RepliedValue = lca.DistributeKgCO2e;// Thomas 1/20, 註解掉是因為lca.DistributeKgCO2e會是null,若不是要確定一下怎麼算出來的
request.DivideBy = divideby;
request.ReplyDate = DateTime.Now;
request.RepliedLCAID = LCAID;
}
else if (!lca.CanReplyOtherRequest)
{
request.RepliedValue = null;
request.RepliedLCAID = LCAID;
}
_db.SaveChanges();
return request;
}
return null;
}
public void DeleteRequest(Guid Uid)
{
var request = _db.ProductLCAReplyRequests.Where(x => x.Uid == Uid).Single();
if (!AuthorizedLCAs.Contains(request.SendLCAID)) throw new Exception("not authorized");
if (request.CanBeDelete)
{
_db.ProductLCAReplyRequests.Remove(request);
_db.SaveChanges();
}
}
//public void ResendRequest(Guid Uid)
//{
// var request = _db.ProductLCAReplyRequests
// .Include(x => x.SentByWhichMaterial)
// .Where(x => x.Uid == Uid)
// .Single();
// if (!AuthorizedLCAs.Contains(request.SendLCAID)) throw new Exception("not authorized");
// request.LastResentDate = DateTime.Now;
// service.SendRequestMessaage(request.MaterialSupplierEmail, CurrentCompany.Name
// , request.RequestLink, request.AnonymousReplyLink,request.MaterialPartNumber
// , request.MaterialName,"");//DL-41
// _db.SaveChanges();
//}
public ProductLCAReplyRequest ResetRequest(int id)
{
ProductLCAReplyRequest request = _db.ProductLCAReplyRequests.Where(x => x.ID == id).First();
request.CreatedDate = DateTime.Now;
if (request.AcceptDate != null)
{
request.AcceptDate = DateTime.Now;
}
else
{
request.AcceptDate = null;
}
request.ReplyDate = null;
request.AcceptReplyDate = null;
_db.SaveChanges();
return request;
}
#endregion
#region Excel Export
private void SaveExcel(IWorkbook workbook, LCA lca, string type , string userName, string baseUrl)
{
// generate excel report 清冊產生處 ?
if (type == "" ||
type != "Inventory" &&
type != "CarbonResult")
{
throw new Exception("Can not save type not exist excel");
}
using (var memoryStream = new MemoryStream())
{
workbook.Write(memoryStream);
using (var memoryStream2 = new MemoryStream(memoryStream.ToArray()))
{
var storage = GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(Storage.AzureStorage)) as Storage.AzureStorage;
if (type == "Inventory")
{
//DL-38
var url = storage.SaveToAzure(memoryStream2, "Inventory.xlsx", baseUrl, userName).ToString();
lca.ProductInventoryResultUrl = url.Substring(url.IndexOf("Browser_Local") - 1);
//lca.ProductInventoryResultUrl = storage.SaveToAzure(memoryStream2, "Inventory.xlsx").ToString();
}
else if (type == "CarbonResult")
{
//DL-38
var url = storage.SaveToAzure(memoryStream2, "ProdLca_Result.xlsx", baseUrl, userName).ToString();
lca.InterrogationResultUrl = url.Substring (url.IndexOf("Browser_Local") - 1);
//lca.InterrogationResultUrl = storage.SaveToAzure(memoryStream2, "Lca_Result.xlsx").ToString();
}
}
}
}
#endregion
#region Word Export
private string ExportWordReport(ProductLCA productLca, string sourceDir
, string targetFile, int LCAID, string userName, string baseUrl)
{
// get tamplate file path
string sourceFileName = CScommon.ProgramConstants.ProductWordReport;
//string sourceDir = "";
bool inWeb = false;
if (string.IsNullOrWhiteSpace(sourceDir) && string.IsNullOrWhiteSpace(targetFile))
{
inWeb = true;
sourceDir = AppDomain.CurrentDomain.BaseDirectory;
}
string templatePath;
try
{
if (inWeb)
templatePath = HttpContext.Current.Server.MapPath("~/Browser_Local/WebFilesRoot");
else
templatePath = Path.Combine(sourceDir, "Browser_Local\\WebFilesRoot");
}
catch
{
templatePath = Path.Combine(sourceDir, "Browser_Local\\WebFilesRoot");
}
//Logger log = NLog.LogManager.GetCurrentClassLogger();
//log.Info($"OrganizationLCAGenerateReport templatePath={templatePath}");
templatePath = Path.Combine(templatePath, userName);
if (!inWeb)
templatePath = sourceDir;
var fileFullName = Path.Combine(templatePath, sourceFileName);
//string sourceFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory
// , "App_Data", sourceFileName);
// 從 sourceFilePath 到 targetFile
using (var file = System.IO.File.Open(fileFullName, FileMode.Open))
using (var cache = new MemoryStream())
//using (var aa = System.IO.File.Create("../../../CompanyCarbonFootprintReport.docx"))
{
file.CopyTo(cache);
// get new file
WordprocessingDocument wordDocument = WordprocessingDocument.Open(cache, true);
ProductLCADocParser docParser = new ProductLCADocParser(wordDocument
, _db);
// replace text on file
BeReplacedTextDTO beReplacedText = PrepareWordData(productLca);
//try
{
docParser.ReplaceAllTextTagWithData(beReplacedText);
}
//catch(Exception ex)
//{
// log.Error(ex.Message);
// log.Error(CScommon.Exceptions.inner(ex));
// log.Error(ex.StackTrace);
// throw;
//}
//docParser.InsertChart(imageStream);
docParser.SaveDocument();
cache.Seek(0, SeekOrigin.Begin);
var storage = GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(Storage.AzureStorage)) as Storage.AzureStorage;
//DL-38
string productName = ProductNameByLCAID(LCAID);
string filename = $"{productName}_產品型報告書{LCAID}.docx";
if (inWeb)
{
var url = storage.SaveToAzure(cache, filename, baseUrl, userName).ToString();
productLca.CarbonFootprintDocxUrl = url.Substring(url.IndexOf("Browser_Local") - 1);
//productLca.CarbonFootprintDocxUrl = storage.SaveToAzure(cache, "CarbonFootprint.docx").ToString();
}
else
{
FileStream fs = new FileStream(targetFile, FileMode.Create, FileAccess.Write);
cache.WriteTo(fs);
fs.Close();
productLca.CarbonFootprintDocxUrl = "";
}
}
string protocolName;
if (inWeb && HttpContext.Current.Request.IsSecureConnection)
protocolName = "https://";
else
protocolName = "http://";
string ret;
if (inWeb)
ret= protocolName + System.Web.HttpContext.Current.Request.Url.Authority + baseUrl
+ productLca.CarbonFootprintDocxUrl;
else
ret = productLca.CarbonFootprintDocxUrl;
return ret;
}
private BeReplacedTextDTO PrepareWordData(ProductLCA productLca)
{
string decimalFormat = "G5";
string percentFormat = "P4";
var surveyResult = productLca.SnapShotSurveyResult;
BeReplacedTextDTO beReplacedText = new BeReplacedTextDTO();
//產品型報告書填入欄位
beReplacedText.LCAID = productLca.ID;
var product = productLca.TargetProduct;
beReplacedText.ProductName = product == null ? "" : product.Name;
beReplacedText.PartNumber = product == null ? "" : product.SerialNumber; ;
beReplacedText.ProductSpec = product == null ? "" : product.SpecDescription; ;
var owner = productLca.Owner;
beReplacedText.CompanyName = owner == null ? "" : owner.Name;
var fab = productLca.TargetFab;
beReplacedText.FabName = fab == null ? "" : fab.Name;
beReplacedText.FabAddress = fab == null ? "" : fab.Address;
beReplacedText.DuringInventory = productLca.StartDate.ToShortDateString() + " ~ " + productLca.EndDate.ToShortDateString();
var inventoryStageData = productLca.TargetInventoryStageData;
beReplacedText.TurnOnHourPerDayInWorkDay = inventoryStageData == null ? "" :
inventoryStageData.TurnOnHourPerDayInWorkDay.ToString();
beReplacedText.TurnOnHourPerDayInOffDay = inventoryStageData == null ? "" :
inventoryStageData.TurnOnHourPerDayInOffDay.ToString();
beReplacedText.WorkDayPerYear = inventoryStageData == null ? "" :
inventoryStageData.WorkDayPerYear.ToString();
beReplacedText.WattInOperation = inventoryStageData == null ? "" :
inventoryStageData.WattInOperation.ToString(decimalFormat);
beReplacedText.WattInLowOperation = inventoryStageData == null ? "" :
inventoryStageData.WattInLowOperation.ToString(decimalFormat);
beReplacedText.EnergyConsumption = inventoryStageData == null ? "" :
EnergyConsumption(inventoryStageData).ToString(decimalFormat);
beReplacedText.UsageStageDescription = inventoryStageData == null ? "" :
inventoryStageData.ProductUsageStageDescription;
beReplacedText.PowerFactor = inventoryStageData == null ? "" :
inventoryStageData.ProductUsageStagePowerFactor.ToString(decimalFormat);
beReplacedText.AbandonedStageDescription = inventoryStageData == null ? "" :
inventoryStageData.ProductAbandonedStage;
var materialProductionAndTransportPhase = CarbonEmissionCalculator.GetMaterialProductionAndTransportPhase(productLca.Materials);
beReplacedText.MaterialProductionAndTransportPhase = materialProductionAndTransportPhase.ToString(decimalFormat);
var productionPhase = CarbonEmissionCalculator.GetProductionPhase(productLca);
beReplacedText.ProductionPhase = productionPhase.ToString(decimalFormat);
var devliveryPhase = CarbonEmissionCalculator.GetDeliveryPhase(productLca);
beReplacedText.DeliveryPhase = devliveryPhase.ToString(decimalFormat);
var usagePhase = inventoryStageData.GetUsageStageCarbonFootprint();
beReplacedText.UsagePhase = usagePhase.ToString(decimalFormat);
var abandonedPhase = CarbonEmissionCalculator.GetAbandonedPhase(inventoryStageData);
beReplacedText.AbandonedPhase = abandonedPhase.ToString(decimalFormat);
beReplacedText.PowerYear = productLca.StartDate != null ? productLca.StartDate.Year.ToString() : "";
var allPhaseCarbonEmission = materialProductionAndTransportPhase
+ productionPhase
+ devliveryPhase
+ usagePhase
+ abandonedPhase;
beReplacedText.AllPhaseCarbonEmission = allPhaseCarbonEmission != 0 ? allPhaseCarbonEmission.ToString(decimalFormat) : "0";
beReplacedText.MaterialProductionAndTransportPhasePercent = allPhaseCarbonEmission != 0 ? (materialProductionAndTransportPhase / allPhaseCarbonEmission).ToString(percentFormat) : "0";
beReplacedText.ProductionPhasePercent = allPhaseCarbonEmission != 0 ? (productionPhase / allPhaseCarbonEmission).ToString(percentFormat) : "0";
beReplacedText.DeliveryPhasePercent = allPhaseCarbonEmission != 0 ? (devliveryPhase / allPhaseCarbonEmission).ToString(percentFormat) : "0";
beReplacedText.UsagePhasePercent = allPhaseCarbonEmission != 0 ? (usagePhase / allPhaseCarbonEmission).ToString(percentFormat) : "0";
beReplacedText.AbandonedPhasePercent = allPhaseCarbonEmission != 0 ? (abandonedPhase / allPhaseCarbonEmission).ToString(percentFormat) : "0";
List<decimal> allPhaseList = new List<decimal>();
var maxIndex = 0;
var secondMaxIndex = 0;
var maxValue = 0m;
var secondMaxValue = 0m;
allPhaseList.Add(materialProductionAndTransportPhase);
allPhaseList.Add(productionPhase);
allPhaseList.Add(devliveryPhase);
allPhaseList.Add(usagePhase);
allPhaseList.Add(abandonedPhase);
for (int i = 0; i < allPhaseList.Count; i++)
{
if (maxValue < allPhaseList[i])
{
maxValue = allPhaseList[i];
maxIndex = i;
}
if (secondMaxValue < allPhaseList[i] && maxValue > allPhaseList[i])
{
secondMaxValue = allPhaseList[i];
secondMaxIndex = i;
}
}
List<string> descriptions = new List<string>()
{
"原物料製造及運輸" , "產品生產製造階段","產品配送階段","產品使用階段","廢棄階段"
};
beReplacedText.BiggestCarbonEmissionPhase = descriptions[maxIndex];
beReplacedText.BiggestCarbonEmissionPercent = allPhaseCarbonEmission != 0 ? (allPhaseList[maxIndex] / allPhaseCarbonEmission).ToString(percentFormat) : "0";
beReplacedText.SecondCarbonEmissionPhase = descriptions[secondMaxIndex];
beReplacedText.SecondCarbonEmissionPercent = allPhaseCarbonEmission != 0 ? (allPhaseList[secondMaxIndex] / allPhaseCarbonEmission).ToString(percentFormat) : "0";
var secondDataTypeOfPartsKgCO2e = CarbonEmissionCalculator.GetSecondDataTypeOfPartsKgCO2e(productLca.Materials);
beReplacedText.SecondDataTypeOfPartsKgCO2e = secondDataTypeOfPartsKgCO2e.ToString(decimalFormat);
beReplacedText.SecondDataTypeOfPartsPercent = allPhaseCarbonEmission != 0 ? (secondDataTypeOfPartsKgCO2e / allPhaseCarbonEmission).ToString(percentFormat) : "0";
var primaryDataTypeOfPartsKgCO2e = CarbonEmissionCalculator.GetPrimaryDataTypeOfPartsKgCO2e(productLca.Materials);
beReplacedText.PrimaryDataTypeOfPartsKgCO2e = primaryDataTypeOfPartsKgCO2e.ToString(decimalFormat);
beReplacedText.PrimaryDataTypeOfPartsPercent = allPhaseCarbonEmission != 0 ? (primaryDataTypeOfPartsKgCO2e / allPhaseCarbonEmission).ToString(percentFormat) : "0";
var materialScopeOneDistributeKgCO2e = CarbonEmissionCalculator.GetMaterialScopeOneDistributeKgCO2e(productLca.Materials);
beReplacedText.MaterialScopeOneDistributeKgCO2e = materialScopeOneDistributeKgCO2e.ToString(decimalFormat);
var materialScopeTwoDistributeKgCO2e = CarbonEmissionCalculator.GetMaterialScopeTwoDistributeKgCO2e(productLca.Materials);
beReplacedText.MaterialScopeTwoDistributeKgCO2e = materialScopeTwoDistributeKgCO2e.ToString(decimalFormat);
var materialScopeThreeDistributeKgCO2e = CarbonEmissionCalculator.GetMaterialScopeThreeDistributeKgCO2e(productLca.Materials);
beReplacedText.MaterialScopeThreeDistributeKgCO2e = materialScopeThreeDistributeKgCO2e.ToString(decimalFormat);
var snapShotSurveryResult = productLca.SnapShotSurveyResult;
var scopeOneFabResult = "";
var scopeTwoFabResult = "";
var scopeThreeFabResult = "";
if (snapShotSurveryResult != null)
{
scopeOneFabResult = snapShotSurveryResult.Scope1FabResult.ToString(decimalFormat);
scopeTwoFabResult = snapShotSurveryResult.Scope2FabResult.ToString(decimalFormat);
scopeThreeFabResult = snapShotSurveryResult.Scope3FabResult.ToString(decimalFormat);
}
beReplacedText.ProductLcaScopeOne = scopeOneFabResult;
beReplacedText.ProductLcaScopeTwo = scopeTwoFabResult;
beReplacedText.ProductLcaScopeThree = scopeThreeFabResult;
var wasteTransportDistributeByHour = CarbonEmissionCalculator.GetWasteTransportDistributeByHour(productLca);
beReplacedText.ProductLcaWasteTransportDistributeByHour = wasteTransportDistributeByHour.ToString(decimalFormat);
// prepare yearly paramter
var vehicleParameters = productLca.VehicleSheet.Select(x => x.Parameter).Distinct();
var vehicleTable = PrepareTable1Data(vehicleParameters);
beReplacedText.Table1Data.AddRange(vehicleTable);
var gasolineParameters = productLca.GasolineEquipmentSheet.Select(x => x.Parameter).Distinct();
var gasolineTable = PrepareTable1Data(gasolineParameters);
beReplacedText.Table1Data.AddRange(gasolineTable);
var kitchenParameters = productLca.KitchenSheet.Select(x => x.Parameter).Distinct();
var kitchenTable = PrepareTable1Data(kitchenParameters);
beReplacedText.Table1Data.AddRange(kitchenTable);
var powerParameters = productLca.PowerUsageSheet.Select(x => x.Parameter).Distinct();
var powerTable = PrepareTable1Data(powerParameters);
beReplacedText.Table1Data.AddRange(powerTable);
var steamParameters = productLca.SteamUsageSheet.Select(x => x.Parameter).Distinct();
var steamTable = PrepareTable1Data(steamParameters);
beReplacedText.Table1Data.AddRange(steamTable);
var waterParameters = productLca.WaterUsageSheet.Select(x => x.Parameter).Distinct();
var waterTable = PrepareTable1Data(waterParameters);
beReplacedText.Table1Data.AddRange(waterTable);
var refrigerantParameterIds = productLca.RefrigerantSheet.Select(x => x.ParameterID2).Distinct();
var refrigerantParameters = _db.NonYearlyParameters.Where(x => refrigerantParameterIds.Contains(x.ID));
var refrigerantTable = refrigerantParameters.Where(x => x != null)
.ToList()
.Select(x => new Weee.DataTransferObject.BeReplacedTextDTO.TableParameterRow()
{
Display = x.Type.DisplayName,
Value = x.Value,
Description = x.Description
});
beReplacedText.Table2Data.AddRange(refrigerantTable);
var repliedMaterials = productLca.Materials.Where(x => x.RequestSent != null).Select(x => x);
var distributeTable = repliedMaterials.Select(x => new Weee.DataTransferObject.BeReplacedTextDTO.TableDistributeRow()
{
MaterialName = x.Name,
SupplierName = x.SupplierCompanyName,
DistributionDescription = x.RequestSent.DivideBy.DisplayString()
});
beReplacedText.Table3And5Data.AddRange(distributeTable);
return beReplacedText;
}
private decimal EnergyConsumption(InventoryStageData inventoryStageData)
{
decimal workDayHightOperate = inventoryStageData.WattInOperation * inventoryStageData.TurnOnHourPerDayInWorkDay / 24;
decimal workDayLowOperate = inventoryStageData.WattInLowOperation * (24 - inventoryStageData.TurnOnHourPerDayInWorkDay) / 24;
decimal offDayHightOperate = inventoryStageData.WattInOperation * inventoryStageData.TurnOnHourPerDayInOffDay / 24;
decimal offDayLowOperatie = inventoryStageData.WattInLowOperation * (24 - inventoryStageData.TurnOnHourPerDayInOffDay) / 24;
decimal hourOfWorkDayPerYear = inventoryStageData.WorkDayPerYear * 24;
decimal hourOfOffDayPerYear = (365 - inventoryStageData.WorkDayPerYear) * 24;
decimal energyConsumption = ((workDayHightOperate + workDayLowOperate) * hourOfWorkDayPerYear +
(offDayHightOperate + offDayLowOperatie) * hourOfOffDayPerYear) /
1000;
return energyConsumption;
}
private IEnumerable<Weee.DataTransferObject.BeReplacedTextDTO.TableParameterRow> PrepareTable1Data(IEnumerable<YearlyParameter> parameters, string display = "")
{
return parameters.Where(x => x != null)
.Select(x => new Weee.DataTransferObject.BeReplacedTextDTO.TableParameterRow()
{
Display = display != "" ? display : x.Type.DisplayName,
Value = x.Value,
Description = x.Description
});
}
#endregion
#region Excel Import Check & Save
public List<string> ExcelImportCheckAndSave(int LCAID, excelExportOrgLCAdataVM excelVMobj, out ImportOrganizationLCA importLCA)
{
var err = new List<string>();
var lca = GetLCAs().Where(x => x.ID == LCAID).FirstOrDefault();
importLCA = new ImportOrganizationLCA();
// 燃料
err.AddRange(ExcelImportCheck_Fuel(LCAID, excelVMobj._orgLCAdata2fuels, lca, ref importLCA));
// 總工時
err.AddRange(ExcelImportCheck_WorkHr(LCAID, excelVMobj._orgLCAdata6workHr, lca, ref importLCA));
// 冷媒設備
err.AddRange(ExcelImportCheck_Refrigerant(LCAID, excelVMobj._orgLCAdata7rfg, lca, ref importLCA));
// 消防設備
err.AddRange(ExcelImportCheck_FireEquipment(LCAID, excelVMobj._orgLCAdata8fire, lca, ref importLCA));
// 其他類關注物質
err.AddRange(ExcelImportCheck_OtherCompound(LCAID, excelVMobj._orgLCAdata9others, lca, ref importLCA));
// 用電量
err.AddRange(ExcelImportCheck_Power(LCAID, excelVMobj._orgLCAdata10elec, lca, ref importLCA));
// 用蒸氣量
err.AddRange(ExcelImportCheck_Steam(LCAID, excelVMobj._orgLCAdata11steamVM, lca, ref importLCA));
return err;
}
public List<string> ExcelImportCheck_Fuel(int LCAID, orgLCAdata2fuelsVM modelVM, LCA lca, ref ImportOrganizationLCA importLCA)
{
var err = new List<string>();
// 消防設備
if (modelVM.fuels_rows.Count > 0)
{
var vehicle = new List<LCACommonSurveyForm_Vehicles>();
var kitchen = new List<LCACommonSurveyForm_Kitchens>();
var gasolineEquipment = new List<LCACommonSurveyForm_GasolineEquipments>();
var config1 = new MapperConfiguration(cfg => {
cfg.CreateMap<LCACommonSurveyForm_Vehicles, LCACommonSurveyForm_Kitchens>();
});
IMapper mapper1 = config1.CreateMapper();
var config2 = new MapperConfiguration(cfg => {
cfg.CreateMap<LCACommonSurveyForm_Vehicles, LCACommonSurveyForm_GasolineEquipments>();
});
IMapper mapper2 = config2.CreateMapper();
if (string.IsNullOrWhiteSpace(modelVM.commonFields.LCAyear.ToString()))
{
err.Add("'油、氣燃料'年份Year不得為空");
return err;
}
if (string.IsNullOrWhiteSpace(modelVM.area))
{
err.Add("'油、氣燃料'區域Area不得為空");
return err;
}
var fuelParameter = (from a in _db.YearlyParameters
join b in _db.YearlyParameterAreas on a.AreaID equals b.ID
join c in _db.YearlyParameterCategories on b.CategoryID equals c.ID
join d in _db.YearlyParameterTypes on a.TypeID equals d.ID
where (c.Category == Categories.GasolineEquipment || c.Category == Categories.Kitchen || c.Category == Categories.Vehicle)
&& a.Year.ToString() == modelVM.commonFields.LCAyear.ToString()
&& modelVM.area.Contains(b.DisplayNameTW)
select new {
Parameter = a,
c.Category,
d.DisplayNameTW,
d.warmGasType
}).AsNoTracking().ToList();
if (fuelParameter == null)
{
err.Add("'油、氣燃料'查無任何 AR version(s) and GWP 係數");
return err;
}
for (var i = 0; i < modelVM.fuels_rows.Count; i++)
{
var category = new Categories();
var add = new LCACommonSurveyForm_Vehicles();
add.LCAID = LCAID;
add.ProcessName = modelVM.fuels_rows[i].ProcessName;
add.ResponsibleUnit = modelVM.fuels_rows[i].ResponsibleUnit;
add.Name = modelVM.fuels_rows[i].Name;
add.Scalar = modelVM.fuels_rows[i].Scalar;
add.Description = modelVM.fuels_rows[i].Description;
add.Evidence = modelVM.fuels_rows[i].Evidence;
var errStr = "";
if (string.IsNullOrWhiteSpace(add.Name))
errStr += "設備名稱不得為空。";
if (add.Scalar < 0)
errStr += "盤查期間使用量需大於等於0。";
add.KgCO2e = add.Scalar;
if (!fuelParameter.Any(x => x.DisplayNameTW.Contains(modelVM.fuels_rows[i].paraName) && x.warmGasType == modelVM.fuels_rows[i].warmGasType ))
errStr += "該燃料不存在。";
else
{
var parameters = fuelParameter.Where(x => x.DisplayNameTW.Contains(modelVM.fuels_rows[i].paraName)).ToList();
if(parameters.Count > 1)
{
// 移動源預設給車輛設備
if (modelVM.fuels_rows[i].warmGasType == WarmGasType.)
parameters = parameters.OrderBy(x => x.Category != Categories.Vehicle).ToList();
// 非移動源柴油預設給柴油設備
else if (modelVM.fuels_rows[i].paraName.Contains("柴油"))
parameters = parameters.OrderBy(x => x.Category != Categories.GasolineEquipment).ToList();
// 其餘皆預設給油氣燃料
else
parameters = parameters.OrderBy(x => x.Category != Categories.Kitchen).ToList();
}
add.ParameterID = parameters[0].Parameter.ID;
add.KgCO2e *= parameters[0].Parameter.Value;
category = parameters[0].Category;
}
if (!string.IsNullOrWhiteSpace(errStr))
err.Add("'油、氣燃料'當中第" + (i + 1) + "筆資料有誤:" + errStr);
if (string.IsNullOrWhiteSpace(errStr))
{
if (category == Categories.Vehicle)
vehicle.Add(add);
else if (category == Categories.Kitchen)
kitchen.Add(mapper1.Map<LCACommonSurveyForm_Vehicles, LCACommonSurveyForm_Kitchens>(add));
else if (category == Categories.GasolineEquipment)
gasolineEquipment.Add(mapper2.Map<LCACommonSurveyForm_Vehicles, LCACommonSurveyForm_GasolineEquipments>(add));
}
}
importLCA.VehicleSheet = vehicle;
importLCA.KitchenSheet = kitchen;
importLCA.GasolineEquipmentSheet = gasolineEquipment;
}
return err;
}
public List<string> ExcelImportCheck_WorkHr(int LCAID, orgLCAdata6workHrVM modelVM, LCA lca, ref ImportOrganizationLCA importLCA)
{
var err = new List<string>();
if (!modelVM.workHourTypeDirect.Any(x => x.Scalar > 0) && !modelVM.workHourTypeIndirect.Any(x => x.Scalar > 0))
return err;
if (string.IsNullOrWhiteSpace(modelVM.commonFields.LCAyear.ToString()))
{
err.Add("'糞肥管理-邊界範圍總工時'年份Year不得為空");
return err;
}
var spvalue = _db.NonYearlyParameters
.Where(y => y.Type.Category.Category == Weee.Models.Paramemter.Categories.Septic)
.Where(y => !y.IsHistory)
.Where(y => y.Type.DisplayNameTW != "GWP")
.AsNoTracking()
.Select(y => y.Value)
.AsEnumerable()
.Multiply();
var GWP_CH4 = (from a in _db.AssessmentReportGWP
where a.chemicalFormula == "CH4"
select a).FirstOrDefault();
if (GWP_CH4 != null && lca.ARversion != null)
{
if (lca.ARversion == "AR4")
spvalue *= GWP_CH4.AR4GWP100;
else if (lca.ARversion == "AR5")
spvalue *= GWP_CH4.AR5GWP100;
else // if (lca.ARversion == "AR6") // 預設AR6
spvalue *= GWP_CH4.AR6GWP100;
}
var finalWorkHrList = new List<LCACommonSurveyForm_WorkHours>();
var workHr = modelVM.workHourList;
for (int j = 0; j < workHr.Count; j++)
{
var oneWorkHrList = workHr[j];
for (var i = 0; i < 12; i++)
{
finalWorkHrList.Add(new LCACommonSurveyForm_WorkHours());
finalWorkHrList[i + j * 12].Index = i + 1;
finalWorkHrList[i + j * 12].LCAID = LCAID;
finalWorkHrList[i + j * 12].WorkerNumber = oneWorkHrList[i].WorkerNumber;
finalWorkHrList[i + j * 12].AverageHourPerDay = oneWorkHrList[i].AverageHourPerDay;
finalWorkHrList[i + j * 12].WorkDay = oneWorkHrList[i].WorkDay;
finalWorkHrList[i + j * 12].Type = oneWorkHrList[i].Type;
finalWorkHrList[i + j * 12].WorkHourPeopleType = oneWorkHrList[i].WorkHourPeopleType;
finalWorkHrList[i + j * 12].Scalar = finalWorkHrList[i].WorkerNumber * finalWorkHrList[i].AverageHourPerDay * finalWorkHrList[i].WorkDay;
finalWorkHrList[i + j * 12].KgCO2e = finalWorkHrList[i].Scalar * spvalue;
}
}
importLCA.WorkHourSheet = finalWorkHrList;
/*
// 總工時 - 直接人員
var workHrDirect = new List<LCACommonSurveyForm_WorkHours>();
if (modelVM.workHourTypeDirect.Count == 12)
{
if (workHrDirect.Count < 12)
for (var i = workHrDirect.Count; i < 12; i++)
workHrDirect.Add(new LCACommonSurveyForm_WorkHours());
for (var i = 0; i < 12; i++)
{
workHrDirect[i].Index = i + 1;
workHrDirect[i].LCAID = LCAID;
workHrDirect[i].WorkerNumber = modelVM.workHourTypeDirect[i].WorkerNumber;
workHrDirect[i].AverageHourPerDay = modelVM.workHourTypeDirect[i].AverageHourPerDay;
workHrDirect[i].WorkDay = modelVM.workHourTypeDirect[i].WorkDay;
workHrDirect[i].Type = LCACommonSurveyForm_WorkHours.WorkHourType.Direct;
workHrDirect[i].Scalar = modelVM.workHourTypeDirect[i].Scalar;
workHrDirect[i].KgCO2e = workHrDirect[i].Scalar * spvalue;
}
}
// 總工時 - 間接人員
var workHrIndirect = new List<LCACommonSurveyForm_WorkHours>();
if (modelVM.workHourTypeIndirect.Count == 12)
{
if (workHrIndirect.Count < 12)
for (var i = workHrIndirect.Count; i < 12; i++)
workHrIndirect.Add(new LCACommonSurveyForm_WorkHours());
for (var i = 0; i < 12; i++)
{
workHrIndirect[i].Index = i + 1;
workHrIndirect[i].LCAID = LCAID;
workHrIndirect[i].WorkerNumber = modelVM.workHourTypeIndirect[i].WorkerNumber;
workHrIndirect[i].AverageHourPerDay = modelVM.workHourTypeIndirect[i].AverageHourPerDay;
workHrIndirect[i].WorkDay = modelVM.workHourTypeIndirect[i].WorkDay;
workHrIndirect[i].Type = LCACommonSurveyForm_WorkHours.WorkHourType.Indirect;
workHrIndirect[i].Scalar = modelVM.workHourTypeIndirect[i].Scalar;
workHrIndirect[i].KgCO2e = workHrIndirect[i].Scalar * spvalue;
}
}
workHrDirect.AddRange(workHrIndirect);
importLCA.WorkHourSheet = workHrDirect;*/
return err;
}
public List<string> ExcelImportCheck_Refrigerant(int LCAID, orgLCAdata7rfgVM modelVM, LCA lca, ref ImportOrganizationLCA importLCA)
{
var err = new List<string>();
// 冷媒設備
if (modelVM.rfg_rows.Count > 0)
{
var refrigerantUsage = new List<LCACommonSurveyForm_Refrigerants>();
var refrigerantParameter1 = (from a in _db.AssessmentReportGWP
where a.GWPtype == GWPparameterType.Refrigerant
select a).AsNoTracking().ToList();
var refrigerantParameter2 = (from a in _db.NonYearlyParameters
join b in _db.NonYearlyParameterTypes on a.TypeID equals b.ID
join c in _db.NonYearlyParameterCategories on b.CategoryID equals c.ID
where c.Category == Categories.Refrigerant
select new{
Parameter = a,
typeName = b.DisplayNameTW
}).AsNoTracking().ToList();
if (refrigerantParameter1 == null)
{
err.Add("'含冷媒/製冷劑之設備'查無任何 AR version(s) and GWP 係數");
return err;
}
if (refrigerantParameter2 == null)
{
err.Add("'含冷媒/製冷劑之設備'查無任何係數");
return err;
}
for (var i = 0; i < modelVM.rfg_rows.Count; i++)
{
var add = new LCACommonSurveyForm_Refrigerants();
add.LCAID = LCAID;
add.ProcessName = modelVM.rfg_rows[i].ProcessName;
add.ResponsibleUnit = modelVM.rfg_rows[i].ResponsibleUnit;
add.Name = modelVM.rfg_rows[i].Name;
add.ModelNumber = modelVM.rfg_rows[i].ModelNumber;
add.TotalNumber = modelVM.rfg_rows[i].TotalNumber;
add.Scalar = modelVM.rfg_rows[i].Scalar;
add.UsedMonth = modelVM.rfg_rows[i].UsedMonth;
add.Description = modelVM.rfg_rows[i].Description;
var errStr = "";
if (add.TotalNumber < 0)
errStr += "全廠台數需大於等於0。";
if (add.Scalar < 0)
errStr += "單台冷煤原始填充量需大於等於0。";
if (add.UsedMonth > 12 || add.UsedMonth < 0)
errStr += "使用月份須0~12個月。";
add.KgCO2e = add.Scalar * add.TotalNumber * add.UsedMonth / 12;
if (!refrigerantParameter1.Any(x => x.ingredientName == modelVM.rfg_rows[i].paraName_refrigerant
|| (!string.IsNullOrWhiteSpace(x.Alias) && x.Alias == modelVM.rfg_rows[i].paraName_refrigerant)))
errStr += $"該使用冷煤種類{modelVM.rfg_rows[i].paraName_refrigerant}不存在。";
else
{
var parameter1 = refrigerantParameter1.Find(x => x.ingredientName == modelVM.rfg_rows[i].paraName_refrigerant || (!string.IsNullOrWhiteSpace(x.Alias) && x.Alias == modelVM.rfg_rows[i].paraName_refrigerant));
add.ARnGWPid = parameter1.ID;
add.KgCO2e *= getGWPValueByARVersion(parameter1, lca.ARversion);
}
if (!refrigerantParameter2.Any(x => modelVM.rfg_rows[i].para2Name_equipment.Contains(x.typeName)))
errStr += $"該設備類型(排放因子){modelVM.rfg_rows[i].para2Name_equipment}不存在。";
else
{
var parameter2 = refrigerantParameter2.Find(x => modelVM.rfg_rows[i].para2Name_equipment.Contains(x.typeName));
add.ParameterID2 = parameter2.Parameter.ID;
add.KgCO2e *= parameter2.Parameter.Value;
}
if (!string.IsNullOrWhiteSpace(errStr))
err.Add("'含冷媒/製冷劑之設備'當中第" + (i + 1) + "筆資料有誤:" + errStr);
if (string.IsNullOrWhiteSpace(errStr))
refrigerantUsage.Add(add);
}
importLCA.RefrigerantSheet = refrigerantUsage;
}
return err;
}
public List<string> ExcelImportCheck_FireEquipment(int LCAID, orgLCAdata8fireVM modelVM, LCA lca, ref ImportOrganizationLCA importLCA)
{
var err = new List<string>();
// 消防設備
if (modelVM.fire_rows.Count > 0)
{
var fireEquipment = new List<LCACommonSurveyForm_FireEquipments>();
var fireEquipmentParameter = (from a in _db.AssessmentReportGWP
where a.GWPtype == GWPparameterType.FireEquipment
select a).AsNoTracking().ToList();
if (fireEquipmentParameter == null)
{
err.Add("'消防設備'查無任何 AR version(s) and GWP 係數");
return err;
}
for (var i = 0; i < modelVM.fire_rows.Count; i++)
{
var add = new LCACommonSurveyForm_FireEquipments();
add.LCAID = LCAID;
add.ProcessName = modelVM.fire_rows[i].ProcessName;
add.ResponsibleUnit = modelVM.fire_rows[i].ResponsibleUnit;
add.Name = modelVM.fire_rows[i].Name;
add.Quantity = modelVM.fire_rows[i].Quantity;
add.Scalar = modelVM.fire_rows[i].Scalar;
add.Description = modelVM.fire_rows[i].Description;
var errStr = "";
if (add.Quantity < 0)
errStr += "數量需大於等於0。";
if (add.Scalar < 0)
errStr += "使用/充填量(kg)需大於等於0。";
add.KgCO2e = add.Scalar * add.Quantity;
if (!fireEquipmentParameter.Any(x => x.ingredientName == modelVM.fire_rows[i].paraName))
errStr += "該排放源不存在。";
else
{
var parameter = fireEquipmentParameter.Find(x => x.ingredientName == modelVM.fire_rows[i].paraName);
add.ARnGWPid = parameter.ID;
add.KgCO2e *= getGWPValueByARVersion(parameter, lca.ARversion);
}
if (!string.IsNullOrWhiteSpace(errStr))
err.Add("'消防設備'當中第" + (i + 1) + "筆資料有誤:" + errStr);
if (string.IsNullOrWhiteSpace(errStr))
fireEquipment.Add(add);
}
importLCA.FireEquipmentSheet = fireEquipment;
}
return err;
}
public List<string> ExcelImportCheck_OtherCompound(int LCAID, orgLCAdata9othersVM modelVM, LCA lca, ref ImportOrganizationLCA importLCA)
{
var err = new List<string>();
// 其他類關注物質
if (modelVM.others_rows.Count > 0)
{
var otherCompound = new List<OrganizationLCAFabSurveyForm_OtherCompounds>();
for (var i = 0; i < modelVM.others_rows.Count; i++)
{
var add = new OrganizationLCAFabSurveyForm_OtherCompounds();
add.LCAID = LCAID;
add.ProcessName = modelVM.others_rows[i].ProcessName;
add.ResponsibleUnit = modelVM.others_rows[i].ResponsibleUnit;
add.Name = modelVM.others_rows[i].Name;
add.Scalar = modelVM.others_rows[i].Scalar;
add.Description = modelVM.others_rows[i].Description;
add.ingredientName = modelVM.others_rows[i].paraName;
add.CO2Factor = modelVM.others_rows[i].CO2Factor;
add.CO2Value = modelVM.others_rows[i].CO2Value;
add.KgCO2e = add.Scalar * (decimal)add.CO2Factor;
var errStr = "";
if (string.IsNullOrWhiteSpace(add.ingredientName))
errStr += "排放源名稱不得為空。";
if (add.Scalar < 0)
errStr += "數量需大於等於0。";
if (!string.IsNullOrWhiteSpace(errStr))
err.Add("'其他類關注物質'當中第" + (i + 1) + "筆資料有誤:" + errStr);
if (string.IsNullOrWhiteSpace(errStr))
otherCompound.Add(add);
}
importLCA.OtherCompound = otherCompound;
}
return err;
}
public List<string> ExcelImportCheck_Power(int LCAID, orgLCAdata10elecVM modelVM, LCA lca, ref ImportOrganizationLCA importLCA)
{
var err = new List<string>();
// 用電量
if (modelVM.elecVMcolumns.Count == 12)
{
if (!modelVM.elecVMcolumns.Any(x => x.Scalar > 0))
return err;
if (string.IsNullOrWhiteSpace(modelVM.commonFields.LCAyear.ToString()))
{
err.Add("'用電量'年份Year不得為空");
return err;
}
if (string.IsNullOrWhiteSpace(modelVM.area))
{
err.Add("'用電量'區域Area不得為空");
return err;
}
var powerUsage = new List<LCACommonSurveyForm_PowerUsages>();
if (powerUsage.Count < 12)
for (var i = powerUsage.Count; i < 12; i++)
powerUsage.Add(new LCACommonSurveyForm_PowerUsages());
var powerParameter = (from a in _db.YearlyParameters
join b in _db.YearlyParameterAreas on a.AreaID equals b.ID
join c in _db.YearlyParameterCategories on b.CategoryID equals c.ID
join d in _db.YearlyParameterTypes on a.TypeID equals d.ID
where c.Category == Categories.Electric && a.Year.ToString() == modelVM.commonFields.LCAyear.ToString()
&& modelVM.area.Contains(b.DisplayNameTW) && d.DisplayNameTW != CScommon.ProgramConstants.POWER_C4_COEFFNAME
select a).AsNoTracking().FirstOrDefault();
if (powerParameter == null)
{
err.Add("用電量查無'" + modelVM.area + "-" + modelVM.commonFields.LCAyear.ToString() + "'該係數");
return err;
}
for (var i = 0; i < 12; i++)
{
powerUsage[i].Index = i + 1;
powerUsage[i].LCAID = LCAID;
powerUsage[i].Area = modelVM.area;
powerUsage[i].Year = modelVM.commonFields.LCAyear.ToString();
powerUsage[i].Peak = modelVM.elecVMcolumns[i].Peak;
powerUsage[i].HalfPeak = modelVM.elecVMcolumns[i].HalfPeak;
powerUsage[i].OffPeak = modelVM.elecVMcolumns[i].OffPeak;
powerUsage[i].SaturdayHalfPeak = modelVM.elecVMcolumns[i].SaturdayHalfPeak;
powerUsage[i].Scalar = modelVM.elecVMcolumns[i].Scalar;
powerUsage[i].ParameterID = powerParameter.ID;
powerUsage[i].KgCO2e = powerUsage[i].Scalar * powerParameter.Value;
}
importLCA.PowerUsageSheet = powerUsage;
}
return err;
}
public List<string> ExcelImportCheck_Steam(int LCAID, orgLCAdata11steamVM modelVM, LCA lca, ref ImportOrganizationLCA importLCA)
{
var err = new List<string>();
// 用蒸氣量
if (modelVM.steamVMcolumns.Count == 12)
{
if (!modelVM.steamVMcolumns.Any(x => x.Scalar > 0))
return err;
if (string.IsNullOrWhiteSpace(modelVM.commonFields.LCAyear.ToString()))
{
err.Add("'用蒸氣量'年份Year不得為空");
return err;
}
if (string.IsNullOrWhiteSpace(modelVM.area))
{
err.Add("'用蒸氣量'區域Area不得為空");
return err;
}
var steamUsage = new List<LCACommonSurveyForm_SteamUsages>();
if (steamUsage.Count < 12)
for (var i = steamUsage.Count; i < 12; i++)
steamUsage.Add(new LCACommonSurveyForm_SteamUsages());
var steamParameter = (from a in _db.YearlyParameters
join b in _db.YearlyParameterAreas on a.AreaID equals b.ID
join c in _db.YearlyParameterCategories on b.CategoryID equals c.ID
join d in _db.YearlyParameterTypes on a.TypeID equals d.ID
where c.Category == Categories.Steam && a.Year.ToString() == modelVM.commonFields.LCAyear.ToString()
&& modelVM.area.Contains(b.DisplayNameTW)
select a).AsNoTracking().FirstOrDefault();
if (steamParameter == null)
{
err.Add("'用蒸氣量'查無'" + modelVM.area + "-" + modelVM.commonFields.LCAyear.ToString() + "'該係數");
return err;
}
for (var i = 0; i < 12; i++)
{
steamUsage[i].Index = i + 1;
steamUsage[i].LCAID = LCAID;
steamUsage[i].Area = modelVM.area;
steamUsage[i].Year = modelVM.commonFields.LCAyear.ToString();
steamUsage[i].Scalar = modelVM.steamVMcolumns[i].Scalar;
steamUsage[i].ParameterID = steamParameter.ID;
steamUsage[i].KgCO2e = steamUsage[i].Scalar * steamParameter.Value;
}
importLCA.SteamUsageSheet = steamUsage;
}
return err;
}
#endregion
private decimal getGWPValueByARVersion(AssessmentReportGWP gwp, string version)
{
if (version == "AR4")
return gwp.AR4GWP100;
else if (version == "AR5")
return gwp.AR5GWP100;
else
return gwp.AR6GWP100;
}
public string CompanyNameByLCAID(int LCAID)
{
string ret = "";
var qry = (from a in _db.Companies
join b in _db.LCAs on a.ID equals b.OwnerID
where b.ID == LCAID
select a.Name).FirstOrDefault();
if (qry != null)
ret = qry;
return ret;
}
public string ProductNameByLCAID(int LCAID)
{
string ret = "";
var qry = (from a in _db.Products
join b in _db.ProductLCAs on a.ID equals b.ProductID
where b.ID == LCAID
select a.Name).FirstOrDefault();
if (qry != null)
ret = qry;
return ret;
}
public Dictionary<string,decimal> GetGWPValueByLCAID(int LCAID)
{
// 取得CH4 N2O GWP在不同AR version的數值
LCAcommon lcaCommonRec = _LCAcommonService.generateReportData(LCAID);
var GWPValue = new Dictionary<string, decimal>();
var qry4 = (from a in _db.AssessmentReportGWP
where a.chemicalFormula == "CH4" || a.chemicalFormula == "N2O"
select a);
var GWP_CH4 = qry4.FirstOrDefault(x => x.chemicalFormula == "CH4");
var GWP_N2O = qry4.FirstOrDefault(x => x.chemicalFormula == "N2O");
GWPValue.Add("CO2", CScommon.ProgramConstants.GWPco2);
if (lcaCommonRec.ARversion == "AR4")
{
GWPValue.Add("CH4", GWP_CH4 == null ? CScommon.ProgramConstants.GWPch4 : GWP_CH4.AR4GWP100);
GWPValue.Add("N2O", GWP_CH4 == null ? CScommon.ProgramConstants.GWPn2o : GWP_N2O.AR4GWP100);
}
else if (lcaCommonRec.ARversion == "AR5")
{
GWPValue.Add("CH4", GWP_CH4 == null ? CScommon.ProgramConstants.GWPch4 : GWP_CH4.AR5GWP100);
GWPValue.Add("N2O", GWP_CH4 == null ? CScommon.ProgramConstants.GWPn2o : GWP_N2O.AR5GWP100);
}
else if (lcaCommonRec.ARversion == "AR6")
{
GWPValue.Add("CH4", GWP_CH4 == null ? CScommon.ProgramConstants.GWPch4 : GWP_CH4.AR6GWP100);
GWPValue.Add("N2O", GWP_CH4 == null ? CScommon.ProgramConstants.GWPn2o : GWP_N2O.AR6GWP100);
}
else
{
GWPValue.Add("CH4", CScommon.ProgramConstants.GWPch4);
GWPValue.Add("N2O", CScommon.ProgramConstants.GWPn2o);
}
return GWPValue;
}
}
}