demo20230512/Service/RiskAssmt/SignificanceAssmtDataService.cs

231 lines
9.8 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.Data.Entity.Migrations;
using System.Data.SqlClient;
using System.Linq;
using System.Threading;
using System.Web;
using Weee.DAL;
using Weee.Models;
using Weee.ViewModels.Lca.LCARiskAssmtSurveyForm;
namespace Weee.Service
{
public class SignificanceAssmtDataService : WeeeLCADataService
{
public SignificanceAssmtDataService(WeeeDataContext db)
: base(db)
{
}
public IQueryable<LCARiskAssmtSurveyForm_SignificanceAssmtQuery> GetList(int LCAID)
//public IQueryable<LCARiskAssmtSurveyForm_SignificanceAssmt> GetList(int LCAID)
{
if (!AuthorizedLCAs.Contains(LCAID)) throw new Exception("not authorized");
var qry = _db.Set<LCARiskAssmtSurveyForm_SignificanceAssmt>().Include(x => x.FactorScores).Where(x => x.LCAID == LCAID)
.OrderByDescending(x => x.ID);
//var qry2 = qry.ToList();
//return qry;
var qry2 = (from a in qry
join b in _db.LCARiskAssmtSurveyForm_LifecycleAssmts on
new { LCAID = a.LCAID, LifeCycleStage = a.LifeCycleStage, GHGEvaluateItem = a.GHGEvaluateItem }
equals new { LCAID = b.LCAID, LifeCycleStage = b.LifeCycleStage, GHGEvaluateItem = b.GHGEvaluateItem }
select new LCARiskAssmtSurveyForm_SignificanceAssmtQuery
{
emitPercentage = b.Percentage,
ID = a.ID,
LCAID = a.LCAID,
Comment = a.Comment,
CreatedBy = a.CreatedBy,
CreatedDate = a.CreatedDate,
FactorScores = a.FactorScores,
ModifiedBy = a.ModifiedBy,
ModifiedDate = a.ModifiedDate,
OwnerLCA = a.OwnerLCA,
LifeCycleStage = a.LifeCycleStage,
Category = a.Category,
GHGEvaluateItem = a.GHGEvaluateItem,
Score = a.Score,
Significance = a.Significance
});
return qry2;
}
public IQueryable<LCARiskAssmtSurveyForm_AssmtFactor> GetAssmtFactors(int LCAID)
{
return _db.Set<LCARiskAssmtSurveyForm_AssmtFactor>().Include(x => x.FactorScores).Where(x => x.LCAID == LCAID);
}
public void Sync(int LCAID)
{
// CFT-511 由主表同步到顯著性評估,要刪除已不存在的項目
string sql = $@"
delete s
from LCARiskAssmtSurveyForm_SignificanceAssmt s
left join LCARiskAssmtSurveyForm_LifecycleAssmt l on s.LCAID=l.LCAID and s.LifeCycleStage=l.LifeCycleStage and s.GHGEvaluateItem=l.GHGEvaluateItem
where (l.LCAID is null or l.LifeCycleStage is null or l.GHGEvaluateItem is null or l.GHGinventoryItemNo is null or len(GHGinventoryItemNo)=0) and s.LCAID=@LCAID
";
int rows = _db.Database.ExecuteSqlCommand(sql, new SqlParameter("@LCAID", LCAID));
sql = $@"
delete s
from LCARiskAssmtSurveyForm_SignificanceAssmtFactor s
join LCARiskAssmtSurveyForm_SignificanceAssmt a on s.SignificanceAssmtID=a.ID
left join LCARiskAssmtSurveyForm_AssmtFactor f on f.ID=s.AssmtFactorID
where f.id is null and a.LCAID=@LCAID
";
rows = _db.Database.ExecuteSqlCommand(sql, new SqlParameter("@LCAID", LCAID));
var user = GetUserContext();
var list = GetList(LCAID).ToList(); // destination
var analyses = _db.Set<LCARiskAssmtSurveyForm_LifecycleAssmt>()
.Where(x => x.LCAID == LCAID && x.GHGinventoryItemNo!=null && x.GHGinventoryItemNo.Length>0).ToList();
var factors = _db.Set<LCARiskAssmtSurveyForm_AssmtFactor>().Where(x => x.LCAID == LCAID).ToList();
if (analyses.Count == 0)
{
throw new Exception("从生命週期流程圖及評估複製資料失败!");
}
else if (factors.Count < 2)
{
throw new Exception("請最少設定兩個以上的評估因子,才可以同步!");
}
else
{
foreach (var lifecycleAssmt in analyses) // source
{
if (!list.Any(s => s.LifeCycleStage == lifecycleAssmt.LifeCycleStage && s.GHGEvaluateItem == lifecycleAssmt.GHGEvaluateItem))
{
int parsedCategory = 0;
int.TryParse(lifecycleAssmt.category, out parsedCategory);
var toBeAdd = new LCARiskAssmtSurveyForm_SignificanceAssmt()
{
LCAID = LCAID,
LifeCycleStage = lifecycleAssmt.LifeCycleStage,
GHGEvaluateItem = lifecycleAssmt.GHGEvaluateItem,
Category= parsedCategory,//lifecycleAssmt.category,
CreatedBy = user.Id,
CreatedDate = DateTime.Now
};
//SetCategory(toBeAdd);
foreach (var factor in factors)
{
toBeAdd.FactorScores.Add(new LCARiskAssmtSurveyForm_SignificanceAssmtFactor()
{
AssmtFactorID = factor.ID
});
}
_db.Set<LCARiskAssmtSurveyForm_SignificanceAssmt>().Add(toBeAdd);
_db.Entry(toBeAdd).State = EntityState.Added;
}
}
_db.SaveChanges();
}
}
//private void SetCategory(LCARiskAssmtSurveyForm_SignificanceAssmt significanceAssmt)
//{
// /*
// * 1. 原物料取得category 4
// * 2. 上游運輸, category 3
// * 3. 運作支援及服務, 僅外購電力為category 2, 其餘為category 4
// * 4. 下游運輸, category 3
// * 5. 產品使用及廢棄, category 5
// * 6. 廢棄物處理, category 4
// */
// if (significanceAssmt.LifeCycleStage == 1)
// {
// significanceAssmt.Category = 4;
// }
// else if (significanceAssmt.LifeCycleStage == 2)
// {
// significanceAssmt.Category = 3;
// }
// else if (significanceAssmt.LifeCycleStage == 3)
// {
// significanceAssmt.Category = IsPurchasedElectricity(significanceAssmt.GHGEvaluateItem) ? 2 : 4;
// }
// else if (significanceAssmt.LifeCycleStage == 4)
// {
// significanceAssmt.Category = 3;
// }
// else if (significanceAssmt.LifeCycleStage == 5)
// {
// significanceAssmt.Category = 5;
// }
// else if (significanceAssmt.LifeCycleStage == 6)
// {
// significanceAssmt.Category = 4;
// }
//}
private bool IsPurchasedElectricity(string ghgEvaluateItem)
{
return !string.IsNullOrEmpty(ghgEvaluateItem) && ghgEvaluateItem.Contains("外購電力") && ghgEvaluateItem.ToUpper().StartsWith("C2");
}
public void UpdateGradingScore(int LCAID, int GradingScore)
{
var lca = GetLCA(LCAID);
var list = GetList(LCAID).ToList();
foreach (var significanceAssmt in list)
{
significanceAssmt.Significance = significanceAssmt.Score >= GradingScore ? 1 : 0;
_db.LCARiskAssmtSurveyForm_SignificanceAssmts.AddOrUpdate(significanceAssmt);
}
lca.GradingScore = GradingScore;
_db.SaveChanges();
}
public void UpdateListDefaultPurpose(int LCAID, string ListDefaultPurpose)
{
var lca = GetLCA(LCAID);
lca.ListDefaultPurpose = ListDefaultPurpose;
int rows = _db.SaveChanges();
Thread.Sleep(0);
}
public LCARiskAssmtSurveyForm_SignificanceAssmt Save(LCARiskAssmtSurveyForm_SignificanceAssmt toBeSave)
{
var user = GetUserContext();
if (!AuthorizedLCAs.Contains(toBeSave.LCAID)) throw new Exception("not authorized");
var entry = _db.Entry(toBeSave);
if (toBeSave.ID == 0)
{
// 資料來自於生命週期流程圖及評估
toBeSave.CreatedBy = user.Id;
toBeSave.CreatedDate = DateTime.Now;
entry.State = EntityState.Added;
}
else
{
foreach (var factorScore in toBeSave.FactorScores)
{
_db.Entry(factorScore).State = EntityState.Modified;
}
toBeSave.ModifiedBy = user.Id;
toBeSave.ModifiedDate = DateTime.Now;
entry.State = EntityState.Modified;
entry.Property(x => x.LCAID).IsModified = false;
}
_db.SaveChanges();
return toBeSave;
}
public void Delete(int ID)
{
var entry = _db.Set<LCARiskAssmtSurveyForm_SignificanceAssmt>().Where(x => x.ID == ID).Single();
var LCA = GetLCA(entry.LCAID);
if (LCA.Status != LCAStatus.New && LCA.Status != LCAStatus.Processing) throw new Exception("Business logic error , should not delete data in this status: " + LCA.Status.ToString());
var ToBeDelete = _db.Entry(entry);
ToBeDelete.State = EntityState.Deleted;
_db.SaveChanges();
}
}
}