361 lines
16 KiB
C#
361 lines
16 KiB
C#
using YLErp.BLL;
|
|
using YLErp.QdpModule;
|
|
|
|
namespace YLErp.Modules.TradeModule.DealModule
|
|
{
|
|
/// <summary>
|
|
/// 展期的服务
|
|
/// </summary>
|
|
public class ExtensionTimeService : YLBaseService
|
|
{
|
|
public ExtensionTimeService(OptUserInfo userInfo) : base(userInfo)
|
|
{
|
|
}
|
|
|
|
public ExtensionTimeService(OptUserInfo optUser, YLContext dbContext) : base(optUser, dbContext)
|
|
{
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取指定交易的展期记录
|
|
/// </summary>
|
|
/// <param name="tradeId"></param>
|
|
/// <returns></returns>
|
|
public List<ExtensionTime> QueryExtensionTimeList(int tradeId)
|
|
{
|
|
return DbContext.ExtensionTime.Where(O => O.TradeId == tradeId && O.IsValid).ToList();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 保存展期记录
|
|
/// </summary>
|
|
/// <param name="info"></param>
|
|
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, ExtensionTime>() { { 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
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// 删除展期记录,并还原交易到期日
|
|
/// </summary>
|
|
/// <param name="tradeId"></param>
|
|
/// <param name="id"></param>
|
|
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, ExtensionTime>() { { 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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 仅删除展期记录,默认不会还原交易到期日(慎用)
|
|
/// </summary>
|
|
/// <param name="tradeId"></param>
|
|
/// <param name="startDate">只删除操作日期大于等于该值的记录</param>
|
|
/// <param name="editTrade">是否修改交易到期日</param>
|
|
/// <param name="saveChanges">是否调用SaveChanges()</param>
|
|
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>() { 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
|
|
}
|
|
|
|
/// <summary>
|
|
/// 删除展期记录
|
|
/// </summary>
|
|
/// <param name="trade"></param>
|
|
/// <param name="obj"></param>
|
|
/// <param name="editTrade"></param>
|
|
/// <param name="addLog"></param>
|
|
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
|
|
});
|
|
}
|
|
}
|
|
}
|