using BaseOUDAL; using YLErp.Model; namespace YLErp.BLL { public class correlationBLL { private YLContext db = new YLContext(); public static object CorrelationLocker = new object(); /// /// /// /// /// error public string InsertCorrelation(CorrelationTable cor) { lock (CorrelationLocker) { //检查是否有存在cor if (db.correlation.Any(c => c.State == valuedate.当前使用 && (c.UnderlyingId1 == cor.UnderlyingId1 && c.UnderlyingId2 == cor.UnderlyingId2) || (c.UnderlyingId1 == cor.UnderlyingId2 && c.UnderlyingId2 == cor.UnderlyingId1))) { return "已经存在对应关系数据,不能新增"; } cor.DayLastState = CorrelationTable.LatestState; cor.LiveState = "Live"; cor.OptDate = DateTime.Now; cor.State = valuedate.当前使用; //根据id先后顺序加入 //需要根据给定的underlying根据id顺序填入underlyingid1,和2否则在分组时会有问题 if (cor.UnderlyingId1 > cor.UnderlyingId2) { //交换 int? temp = cor.UnderlyingId1; string tempcode = cor.UnderlyingCode1; cor.UnderlyingId1 = cor.UnderlyingId2; cor.UnderlyingCode1 = cor.UnderlyingCode2; cor.UnderlyingId2 = temp; cor.UnderlyingCode2 = tempcode; } db.correlation.Add(cor); db.SaveChanges(); } return ""; } public SearchListResult SearchGroupList(CorrelationReq req) { var predicate = PredicateBuilder.Create(n => n.ValueDate >= req.ValueDateStart && n.DayLastState == CorrelationTable.LatestState && n.LiveState != "Matured"); if (!string.IsNullOrWhiteSpace(req.UnderlyingCode1)) { predicate = predicate.And(n => n.UnderlyingCode1 == req.UnderlyingCode1); } if (!string.IsNullOrWhiteSpace(req.UnderlyingCode2)) { predicate = predicate.And(n => n.UnderlyingCode2 == req.UnderlyingCode2); } if (req.ValueDateEnd.Year > 1) { predicate = predicate.And(n => n.ValueDate <= req.ValueDateEnd); } var query = db.correlation.Where(predicate).OrderBy(n => n.id); if (string.IsNullOrEmpty(req.sidx)) { req.sidx = "id"; req.sord = "desc"; } return query.ToSearchList(req, false); } /// /// 查询correlation /// public SearchListResult SearchList(CorrelationReq req) { var query = from source in db.correlation select source; if (req.UnderlyingId1 != null) { query = query.Where(d => d.UnderlyingId1 == req.UnderlyingId1); } if (!string.IsNullOrEmpty(req.UnderlyingCode1)) { query = query.Where(d => d.UnderlyingCode1.Contains(req.UnderlyingCode1)); } if (req.UnderlyingId2 != null) { query = query.Where(d => d.UnderlyingId2 == req.UnderlyingId2); } if (!string.IsNullOrEmpty(req.UnderlyingCode2)) { query = query.Where(d => d.UnderlyingCode2.Contains(req.UnderlyingCode2)); } if (req.OptId != null) { if (req.OptId > 1) { query = query.Where(d => d.OptId == req.OptId); } } if (req.ValueDateStart != DateTime.MinValue) { query = query.Where(d => d.ValueDate >= req.ValueDateStart); } if (req.ValueDateEnd != DateTime.MinValue) { DateTime ValueDateTemp = req.ValueDateEnd.AddDays(1); query = query.Where(d => d.ValueDate < ValueDateTemp); } if (!string.IsNullOrEmpty(req.State)) { query = query.Where(d => d.State.Contains(req.State)); } if (string.IsNullOrEmpty(req.sidx)) { req.sidx = "id"; req.sord = "desc"; } return query.ToSearchList(req); } // get correlation value given two underlyings' id public static double findCorrelation(int underlyingId1, int underlyingId2, YLContext con) { var correlation = con.correlation.FirstOrDefault(c => c.State == valuedate.当前使用 && (c.UnderlyingId1 == underlyingId1 && c.UnderlyingId2 == underlyingId2) || (c.UnderlyingId1 == underlyingId2 && c.UnderlyingId2 == underlyingId1)); return correlation == null || correlation.Correlation == null ? 0.0 : correlation.Correlation.Value; } } }