demo20230512/Service/RiskAssmt/AssmtFactorDataService.cs

212 lines
9.3 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.SqlClient;
using System.Linq;
using System.Web;
using Weee.DAL;
using Weee.Models;
using Weee.ViewModels.DataTransferObject;
namespace Weee.Service
{
public class AssmtFactorDataService : WeeeLCADataService
{
public AssmtFactorDataService(WeeeDataContext db)
: base(db)
{
}
public IQueryable<LCARiskAssmtSurveyForm_AssmtFactor> GetList(int LCAID)
{
if (!AuthorizedLCAs.Contains(LCAID)) throw new Exception("not authorized");
return _db.Set<LCARiskAssmtSurveyForm_AssmtFactor>().Include(x => x.FactorScores).Where(x => x.LCAID == LCAID)
.OrderByDescending(x => x.ID);
}
public LCARiskAssmtSurveyForm_AssmtFactor Save(AssmtFactorDTO toBeSave)
{
CheckScore(toBeSave);
var user = GetUserContext();
if (!AuthorizedLCAs.Contains(toBeSave.LCAID)) throw new Exception("not authorized");
var entry = _db.Set<LCARiskAssmtSurveyForm_AssmtFactor>().FirstOrDefault(x => x.ID == toBeSave.ID);
var isEdited = false;
var assmtFactorIDList = new List<int>();
if (entry == null)
{
if (_db.Set<LCARiskAssmtSurveyForm_AssmtFactor>().Any(x => x.LCAID == toBeSave.LCAID && x.FactorName == toBeSave.FactorName))
{
throw new Exception($"评估因子名称不能重复");
}
entry = new LCARiskAssmtSurveyForm_AssmtFactor()
{
LCAID = toBeSave.LCAID,
FactorName = toBeSave.FactorName,
Comment = toBeSave.Comment
};
foreach (var factorScore in toBeSave.FactorScores)
{
entry.FactorScores.Add(new LCARiskAssmtSurveyForm_AssmtFactorScore()
{
OptionDescription = factorScore.OptionDescription,
OptionScore = factorScore.OptionScore,
Comment = factorScore.Comment,
CreatedBy = user.Id,
CreatedDate = DateTime.Now
});
}
_db.Set<LCARiskAssmtSurveyForm_AssmtFactor>().Add(entry);
_db.Entry(entry).State = EntityState.Added;
}
else
{
if (_db.Set<LCARiskAssmtSurveyForm_AssmtFactor>().Any(x => x.ID != entry.ID && x.LCAID == toBeSave.LCAID && x.FactorName == toBeSave.FactorName))
{
throw new Exception($"评估因子名称不能重复");
}
entry.FactorName = toBeSave.FactorName;
entry.Comment = toBeSave.Comment;
entry.ModifiedBy = user.Id;
entry.ModifiedDate = DateTime.Now;
var factorScores = _db.Set<LCARiskAssmtSurveyForm_AssmtFactorScore>().Where(x => x.FactorId == entry.ID).ToList();
var count = factorScores.Count;
for (int i = count - 1; i >= 0; i--)
{
var factorScore = factorScores.ElementAt(i);
if (!toBeSave.FactorScores.Any(x => x.ID == factorScore.ID))
{
assmtFactorIDList.Add(factorScore.FactorId);
isEdited = true;
factorScores.Remove(factorScore);
_db.Set<LCARiskAssmtSurveyForm_AssmtFactorScore>().Attach(factorScore);
_db.Entry(factorScore).State = EntityState.Deleted;
}
}
foreach (var factorScore in toBeSave.FactorScores)
{
if (factorScore.ID > 0)
{
assmtFactorIDList.Add(factorScore.FactorId);
isEdited = true;
var updatingFactorScore = factorScores.First(fs => fs.ID == factorScore.ID);
updatingFactorScore.OptionDescription = factorScore.OptionDescription;
updatingFactorScore.OptionScore = factorScore.OptionScore;
updatingFactorScore.Comment = factorScore.Comment;
updatingFactorScore.ModifiedBy = user.Id;
updatingFactorScore.ModifiedDate = DateTime.Now;
_db.Set<LCARiskAssmtSurveyForm_AssmtFactorScore>().Attach(updatingFactorScore);
_db.Entry(updatingFactorScore).State = EntityState.Modified;
}
else
{
var addingFactorScore = new LCARiskAssmtSurveyForm_AssmtFactorScore()
{
FactorId = entry.ID,
OptionDescription = factorScore.OptionDescription,
OptionScore = factorScore.OptionScore,
Comment = factorScore.Comment,
CreatedBy = user.Id,
CreatedDate = DateTime.Now
};
_db.Set<LCARiskAssmtSurveyForm_AssmtFactorScore>().Attach(addingFactorScore);
_db.Entry(addingFactorScore).State = EntityState.Added;
}
}
_db.Set<LCARiskAssmtSurveyForm_AssmtFactor>().Attach(entry);
_db.Entry(entry).State = EntityState.Modified;
_db.Entry(entry).Property(x => x.LCAID).IsModified = false;
}
_db.SaveChanges();
// 將新增的評估因子更新到顯著性評估項目中
string sql = $@"
insert into LCARiskAssmtSurveyForm_SignificanceAssmtFactor (SignificanceAssmtID, AssmtFactorID, Score)
select a.SignificanceAssmtID, a.AssmtFactorID, 0 Score
from
(select a.ID AssmtFactorID, s.id SignificanceAssmtID
from LCARiskAssmtSurveyForm_AssmtFactor a, LCARiskAssmtSurveyForm_SignificanceAssmt s
where a.LCAID=@LCAID and s.LCAID=@LCAID) a
left join (
select SignificanceAssmtID, AssmtFactorID
from LCARiskAssmtSurveyForm_SignificanceAssmtFactor
group by SignificanceAssmtID, AssmtFactorID
) c on a.AssmtFactorID=c.AssmtFactorID and a.SignificanceAssmtID=c.SignificanceAssmtID
where c.AssmtFactorID is null or c.SignificanceAssmtID is null
";
int rows = _db.Database.ExecuteSqlCommand(sql, new SqlParameter("@LCAID", toBeSave.LCAID));
UpdateLCA_SignificanceAssmts(toBeSave.LCAID, assmtFactorIDList);
return entry;
}
private void CheckScore(AssmtFactorDTO toBeSave)
{
if (toBeSave.FactorScores.Any(x => x.OptionScore < 1 || x.OptionScore > 10))
{
throw new Exception($"评分范围1~10{nameof(toBeSave.FactorScores)}");
}
}
public void Delete(int ID)
{
var entry = _db.Set<LCARiskAssmtSurveyForm_AssmtFactor>().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();
// 將刪除的評估因子更新到顯著性評估項目中
string sql = $@"
delete from LCARiskAssmtSurveyForm_SignificanceAssmtFactor
where LCARiskAssmtSurveyForm_SignificanceAssmtFactor.AssmtFactorID = @ID
and LCARiskAssmtSurveyForm_SignificanceAssmtFactor.SignificanceAssmtID in (select id from LCARiskAssmtSurveyForm_SignificanceAssmt where LCAID = @LCAID)
";
object[] parameters = { new SqlParameter("@ID", ID), new SqlParameter("@LCAID", entry.LCAID) };
int rows = _db.Database.ExecuteSqlCommand(sql, parameters);
UpdateLCA_SignificanceAssmts(entry.LCAID,new List<int>());
}
public void UpdateLCA_SignificanceAssmts(int LCAID,List<int> assmtFacotrIDs)
{
var significanceAssmts = _db.LCARiskAssmtSurveyForm_SignificanceAssmts.Where(x => x.LCAID == LCAID).ToList();
var factors = (from saf in _db.LCARiskAssmtSurveyForm_SignificanceAssmtFactors
join sa in _db.LCARiskAssmtSurveyForm_SignificanceAssmts on saf.SignificanceAssmtID equals sa.ID
where sa.LCAID == LCAID
select saf).ToList();
var gradingScore = _db.LCAs.Where(x => x.ID == LCAID).First().GradingScore;
foreach (var factor in factors)
{
if (assmtFacotrIDs.Contains(factor.AssmtFactorID))
factor.Score = 0;
}
foreach (var significanceAssmt in significanceAssmts)
{
var thisFactors = factors.Where(x => x.SignificanceAssmtID == significanceAssmt.ID).Select(x => x.Score);
if (thisFactors.Count() == 0)
significanceAssmt.Score = 0;
else
significanceAssmt.Score = thisFactors.Aggregate((m, n) => m * n);
significanceAssmt.Significance = significanceAssmt.Score >= gradingScore ? 1 : 0;
}
_db.SaveChanges();
}
}
}