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 GetList(int LCAID) //public IQueryable GetList(int LCAID) { if (!AuthorizedLCAs.Contains(LCAID)) throw new Exception("not authorized"); var qry = _db.Set().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 GetAssmtFactors(int LCAID) { return _db.Set().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() .Where(x => x.LCAID == LCAID && x.GHGinventoryItemNo!=null && x.GHGinventoryItemNo.Length>0).ToList(); var factors = _db.Set().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().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().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(); } } }