using YLErp.BLL; using YLErp.QdpModule; namespace YLErp.Modules.TradeModule.DealModule { /// /// 展期的服务 /// public class ExtensionTimeService : YLBaseService { public ExtensionTimeService(OptUserInfo userInfo) : base(userInfo) { } public ExtensionTimeService(OptUserInfo optUser, YLContext dbContext) : base(optUser, dbContext) { } /// /// 获取指定交易的展期记录 /// /// /// public List QueryExtensionTimeList(int tradeId) { return DbContext.ExtensionTime.Where(O => O.TradeId == tradeId && O.IsValid).ToList(); } /// /// 保存展期记录 /// /// public void SaveExtensionTime(ExtensionTime info) { #region 检查 var obj = DbContext.ExtensionTime.Where(O => O.id == info.id).FirstOrDefault(); var trade = DbContext.trade.Where(O => O.id == info.TradeId).FirstOrDefault(); if (obj == null) { obj = new ExtensionTime(); obj.DataTag = Guid.NewGuid().ToString("N"); obj.OldMaturityDate = trade.ExerciseDate ?? trade.TradeDate ?? DateTime.MinValue; DbContext.ExtensionTime.Add(obj); } if (obj.OldMaturityDate == info.NewMaturityDate) { throw new ServiceException("新到期日不应和原到期日一致!"); } if (obj.ValueDate >= info.ValueDate) { throw new ServiceException("新展期日应晚于原展期日!"); } if (trade == null) { throw new ServiceException("未找到交易,请刷新页面后再次尝试!"); } #endregion #region 操作 var tradeDict = new Dictionary() { { trade, obj } }; var tId = info.TradeId; var newMaturityDate = info.NewMaturityDate; if (trade.TradeType == "结构化交易") { var otherTrades = (from t in DbContext.trade join et in DbContext.ExtensionTime.Where(O => O.IsValid && O.NewMaturityDate == newMaturityDate) on t.id equals et.TradeId into tempEt from et in tempEt.DefaultIfEmpty() where t.ParentTradeId == tId select new { trade, et }).ToDictionary(K => K.trade, V => V.et); foreach (var item in otherTrades) { var et = item.Value; if (et == null) { et = new ExtensionTime(); et.DataTag = obj.DataTag; et.OldMaturityDate = obj.OldMaturityDate; DbContext.ExtensionTime.Add(et); } tradeDict.Add(item.Key, et); } } else if (trade.ParentTradeId > 0) { var pId = trade.ParentTradeId; var otherTrades = (from t in DbContext.trade join et in DbContext.ExtensionTime.Where(O => O.IsValid && O.NewMaturityDate == newMaturityDate) on t.id equals et.TradeId into tempEt from et in tempEt.DefaultIfEmpty() where (t.id == pId || t.ParentTradeId == pId) && t.id != tId select new { trade, et }).ToDictionary(K => K.trade, V => V.et); foreach (var item in otherTrades) { var et = item.Value; if (et == null) { et = new ExtensionTime(); et.DataTag = obj.DataTag; et.OldMaturityDate = obj.OldMaturityDate; DbContext.ExtensionTime.Add(et); } tradeDict.Add(item.Key, et); } } foreach (var item in tradeDict) { saveExtensionTime(item.Key, item.Value, info.ValueDate, info.NewMaturityDate); } DbContext.SaveChanges(); //修改报送记录为已修改; foreach (var item in tradeDict) { var infoTag = $"_{item.Value.id}_展期"; var notes = DbContext.sac_report_notes.Where(O => O.InfoTag.Contains(infoTag)).ToArray(); foreach (var note in notes) { note.changeStatus = true; } } #endregion DbContext.SaveChanges(); } private void saveExtensionTime(trade trade, ExtensionTime obj, DateTime valueDate, DateTime newMaturityDate) { var dateStr = (obj.id > 0 ? trade.ExerciseDate ?? trade.TradeDate ?? DateTime.MinValue : obj.OldMaturityDate).ToString("yyyy-MM-dd"); var interval = newMaturityDate - trade.ExerciseDate; var newSettlementDate = (trade.SettlementDate ?? trade.ExerciseDate ?? obj.OldMaturityDate).AddDays(interval.Value.Days); var changes = $"[[\"ExerciseDate\",\"到期日期\",\"{trade.ExerciseDate?.ToString("yyyy-MM-dd")}\",\"{newMaturityDate.ToString("yyyy-MM-dd")}\",\"0\",\"{obj.DataTag}\",\"{valueDate.ToString("yyyy-MM-dd")}\"],[\"SettlementDate\",\"结算日期\",\"{trade.SettlementDate?.ToString("yyyy-MM-dd")}\",\"{newSettlementDate.ToString("yyyy-MM-dd")}\",\"0\",\"{obj.DataTag}\",\"{valueDate.ToString("yyyy-MM-dd")}\"]]"; obj.ValueDate = valueDate; obj.TradeId = trade.id; obj.NewMaturityDate = newMaturityDate; obj.IsValid = true; obj.OptId = UserId; obj.OptDate = DateTime.Now; trade.ExerciseDate = newMaturityDate; trade.SettlementDate = newSettlementDate; if (trade.TradeType == "收益互换") { var tid = trade.id; var tradeSwapDetial = DbContext.trade_swap_detail.Where(O => O.TradeId == tid); foreach (var item in tradeSwapDetial) { item.ExerciseDate = newMaturityDate; } var trade_swap = DbContext.trade_swap.FirstOrDefault(t => t.TradeId == tid); var customizedResultsGet = QdpHelper.ParseAutocallCustomizedInfo(trade_swap.GetSwapTimeAndRate); var newDateStr= newMaturityDate.ToString("yyyy-MM-dd"); if (customizedResultsGet.Item2 != null&& customizedResultsGet.Item2.Count()==1&& trade_swap.GetSwapTimeAndRate.Contains(dateStr)) { trade_swap.GetSwapTimeAndRate = trade_swap.GetSwapTimeAndRate.Replace(dateStr, newDateStr); } var customizedResultsPay = QdpHelper.ParseAutocallCustomizedInfo(trade_swap.PaySwapTimeAndRate); if (customizedResultsPay.Item2 != null&& customizedResultsPay.Item2.Count()==1 && trade_swap.PaySwapTimeAndRate.Contains(dateStr)) { trade_swap.PaySwapTimeAndRate = trade_swap.PaySwapTimeAndRate.Replace(dateStr, newDateStr); } } DbContext.TradeAuditLog.Add(new TradeAuditLog() { TradeId = obj.TradeId, Changes = changes, DataType = "C02", OptId = UserId, OptName = UserName, OptDate = OptDate, OptType = "交易展期", AuditFlag = TradeAuditFlag.operation }); } /// /// 删除展期记录,并还原交易到期日 /// /// /// public trade DelExtensionTime(int tradeId, int id) { #region 检查 var trade = DbContext.trade.Where(O => O.id == tradeId).FirstOrDefault(); if (trade == null) { throw new ServiceException("未找到交易,请刷新页面后再次尝试!"); } var obj = DbContext.ExtensionTime.Where(O => O.id == id && O.TradeId == trade.id).FirstOrDefault(); if (obj == null) { throw new ServiceException("未找到展期记录,请刷新页面后再次尝试!"); } if (trade.ExerciseDate != obj.NewMaturityDate) { throw new ServiceException("展期记录应按照添加时间倒序依次删除!"); } #endregion #region 操作 var tradeDict = new Dictionary() { { trade, obj } }; var newMaturityDate = obj.NewMaturityDate; if (trade.TradeType == "结构化交易") { var otherTrades = (from t in DbContext.trade join et in DbContext.ExtensionTime.Where(O => O.IsValid && O.NewMaturityDate == newMaturityDate) on t.id equals et.TradeId where t.ParentTradeId == tradeId select new { trade, et }).ToDictionary(K => K.trade, V => V.et); foreach (var item in otherTrades) { tradeDict.Add(item.Key, item.Value); } } else if (trade.ParentTradeId > 0) { var pId = trade.ParentTradeId; var otherTrades = (from t in DbContext.trade join et in DbContext.ExtensionTime.Where(O => O.IsValid && O.NewMaturityDate == newMaturityDate) on t.id equals et.TradeId where (t.id == pId || t.ParentTradeId == pId) && t.id != tradeId select new { trade, et }).ToDictionary(K => K.trade, V => V.et); foreach (var item in otherTrades) { tradeDict.Add(item.Key, item.Value); } } foreach (var item in tradeDict) { delExtensionTime(item.Key, item.Value); } DbContext.SaveChanges(); #endregion return trade; } /// /// 仅删除展期记录,默认不会还原交易到期日(慎用) /// /// /// 只删除操作日期大于等于该值的记录 /// 是否修改交易到期日 /// 是否调用SaveChanges() public void DelExtensionTime(int tradeId, DateTime startDate, bool editTrade = false, bool saveChanges = false) { #region 检查 var trade = DbContext.trade.Where(O => O.id == tradeId).FirstOrDefault(); if (trade == null) { throw new ServiceException("未找到交易,请刷新页面后再次尝试!"); } #endregion #region 操作 var tradeList = new List() { trade }; if (trade.TradeType == "结构化交易") { var otherTrades = DbContext.trade.Where(O => O.ParentTradeId == tradeId).ToArray(); tradeList.AddRange(otherTrades); } else if (trade.ParentTradeId > 0) { var pId = trade.ParentTradeId; var otherTrades = DbContext.trade.Where(O => (O.id == pId || O.ParentTradeId == pId) && O.id != tradeId).ToArray(); tradeList.AddRange(otherTrades); } foreach (var item in tradeList) { var objArr = DbContext.ExtensionTime.Where(O => O.TradeId == tradeId && O.IsValid && O.OptDate >= startDate).OrderByDescending(O => O.OptDate).ToArray(); foreach (var obj in objArr) { delExtensionTime(item, obj, editTrade); } } if (saveChanges) { DbContext.SaveChanges(); } #endregion } /// /// 删除展期记录 /// /// /// /// /// private void delExtensionTime(trade trade, ExtensionTime obj, bool editTrade = true) { var dateStr = trade.ExerciseDate.Value.ToString("yyyy-MM-dd"); var interval = trade.ExerciseDate - obj.OldMaturityDate; var oldSettlementDate = (trade.SettlementDate ?? trade.ExerciseDate ?? obj.OldMaturityDate).AddDays(-interval.Value.Days); var changes = $"[[\"ExerciseDate\",\"到期日期\",\"{trade.ExerciseDate?.ToString("yyyy-MM-dd")}\",\"{obj.OldMaturityDate.ToString("yyyy-MM-dd")}\",\"0\",\"{obj.DataTag}\",\"{obj.ValueDate.ToString("yyyy-MM-dd")}\"],[\"SettlementDate\",\"结算日期\",\"{trade.SettlementDate?.ToString("yyyy-MM-dd")}\",\"{oldSettlementDate.ToString("yyyy-MM-dd")}\",\"0\",\"{obj.DataTag}\",\"{obj.ValueDate.ToString("yyyy-MM-dd")}\"]]"; if (editTrade) { trade.ExerciseDate = obj.OldMaturityDate; trade.SettlementDate = oldSettlementDate; } obj.IsValid = false; obj.OptId = UserId; obj.OptDate = DateTime.Now; if (editTrade && trade.TradeType == "收益互换") { var tId = trade.id; var tradeSwapDetial = DbContext.trade_swap_detail.Where(O => O.TradeId == tId); foreach (var item in tradeSwapDetial) { item.ExerciseDate = obj.OldMaturityDate; } var trade_swap = DbContext.trade_swap.FirstOrDefault(t => t.TradeId == tId); var customizedResultsGet = QdpHelper.ParseAutocallCustomizedInfo(trade_swap.GetSwapTimeAndRate); var newDateStr = obj.OldMaturityDate.ToString("yyyy-MM-dd"); if (customizedResultsGet.Item2 != null && customizedResultsGet.Item2.Count() == 1 && trade_swap.GetSwapTimeAndRate.Contains(dateStr)) { trade_swap.GetSwapTimeAndRate = trade_swap.GetSwapTimeAndRate.Replace(dateStr, newDateStr); } var customizedResultsPay = QdpHelper.ParseAutocallCustomizedInfo(trade_swap.PaySwapTimeAndRate); if (customizedResultsPay.Item2 != null && customizedResultsPay.Item2.Count() == 1 && trade_swap.PaySwapTimeAndRate.Contains(dateStr)) { trade_swap.PaySwapTimeAndRate = trade_swap.PaySwapTimeAndRate.Replace(dateStr, newDateStr); } } DbContext.TradeAuditLog.Add(new TradeAuditLog() { TradeId = obj.TradeId, Changes = changes, DataType = "C02", OptId = UserId, OptName = UserName, OptDate = OptDate, OptType = "交易展期撤销", AuditFlag = TradeAuditFlag.operation }); } } }