demo20230512/Service/RiskAssmt/AssmtFactorDataService.cs
2023-05-12 10:20:28 +08:00

212 lines
9.3 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();
}
}
}