188 lines
7.7 KiB
C#
188 lines
7.7 KiB
C#
using YLErp.BLL;
|
|
using YLErp.Commons;
|
|
using YLErp.DBModels.Consts;
|
|
using YLErp.DBModels.Enums;
|
|
using YLErp.Model;
|
|
using YLErp.Modules.ClientModule;
|
|
|
|
namespace YLErp.Modules.TradeModule.DealModule
|
|
{
|
|
/// <summary>
|
|
/// 交易到期操作
|
|
/// </summary>
|
|
public class TradeExpireService : TradeServiceBase
|
|
{
|
|
public TradeExpireService(YLBaseService baseService) : base(baseService)
|
|
{
|
|
}
|
|
|
|
public TradeExpireService(OptUserInfo userInfo) : base(userInfo)
|
|
{
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 日终执行批量行权到期
|
|
/// 迁移自:ExeExpireTradeCashJson
|
|
/// </summary>
|
|
public void ExeExpireTradeCash(TradeCashReq req, trade_cash formData)
|
|
{
|
|
var valueDate = valuedateBLL.ValueDate;
|
|
//修改交易主表信息交易状态为已执行
|
|
var td = DbContext.trade.FirstOrDefault(t => t.id == req.TradeId);
|
|
if (td == null)
|
|
{
|
|
throw new ServiceException("更新失败,找不到要交割的主交易!");
|
|
}
|
|
|
|
if (td.TradeType == "结构化交易")
|
|
{
|
|
throw new ServiceException("操作失败,结构化交易主交易不支持此操作");
|
|
}
|
|
|
|
if (PS.Config.TradeElement.ExecuteAfterGeneratedConfirmDoc && !td.HasGeneratedConfirmBook() && td.TradeType != "自定义交易")
|
|
{
|
|
throw new ServiceException("请先去生成交易确认书!");
|
|
}
|
|
if (td.TradeStatus != ConsTrade.确认成交 && td.TradeStatus != ConsTrade.提前终止拒绝 && td.TradeStatus != ConsTrade.行权待复核)
|
|
{
|
|
throw new ServiceException("行权失败,状态为" + td.TradeStatus + ",该交易状态不能行权!");
|
|
}
|
|
|
|
//增加执行日期
|
|
td.UnWindDate = valueDate;
|
|
td.OptDate = DateTime.Now;
|
|
td.OptId = UserId;
|
|
td.OptName = UserName;
|
|
td.FinalPrice = req.FinalPrice;
|
|
|
|
var tcspotPrice = DataCacheProvider.GetUnderlyingDataSource().GetPrice(td.UnderlyingCode);
|
|
if (req.IsPossibleExec.HasValue && req.IsPossibleExec.Value)
|
|
{
|
|
//修改交易状态
|
|
td.TradeStatus = ConsTrade.已执行;
|
|
//trade_cash
|
|
var tc = DbContext.trade_cash.FirstOrDefault(t => t.TradeId == td.id && t.Action == ClientCashInCashOut.系统操作_行权费 && t.ValidState != ConsGlobal.InValid && !t.IsDeleted);
|
|
|
|
if (tc == null)
|
|
{
|
|
tc = new trade_cash();
|
|
DbContext.trade_cash.Add(tc);
|
|
}
|
|
if (formData != null)
|
|
{
|
|
UpdateChanges(tc, formData);
|
|
}
|
|
|
|
tc.SpotPrice = tcspotPrice;
|
|
tc.ValidState = req.ValidState;
|
|
tc.OptId = UserId;
|
|
tc.OptName = UserName;
|
|
tc.OptDate = DateTime.Now;
|
|
tc.Action = ClientCashInCashOut.系统操作_行权费;
|
|
tc.IsLastAction = true;
|
|
tc.ValueDate = valueDate;
|
|
tc.FinalPrice = req.FinalPrice;
|
|
tc.Amount = req.Amount ?? 0;
|
|
tc.Strike = req.Strike;
|
|
tc.CallPut = req.CallPut;
|
|
tc.ExtraAmount = req.ExtraAmount;
|
|
tc.Status = TradeCashStatusEnum.已执行;
|
|
tc.TradeType = td.BuySell;
|
|
tc.TradeId = td.id;
|
|
tc.ParentTradeId = td.ParentTradeId;
|
|
tc.Notional = td.Notional;
|
|
tc.UnwindPercentRate = td.Notional / td.OriginalNotional;
|
|
tc.NotionalPercentRate = tc.UnwindPercentRate;
|
|
var CountRatio = UnderlyingDataProvider.GetCountRatio(td.UnderlyingCode);
|
|
tc.TradeAmount = tc.Notional / CountRatio;
|
|
tc.ExerciseWay = TradeCashExerciseWayEnum.到期行权;
|
|
DbContext.SaveChanges();
|
|
|
|
new TradeCashService(this).SaveTradeCashDetail(tc);
|
|
//增加出入金记录
|
|
var cl = ClientDataQueryService.GetClient(td.ClientId) ?? new Models.ClientMainInfo();
|
|
var ee = new ClientCashInCashOut
|
|
{
|
|
Direction = "应收",
|
|
Number = UniqueTimeId.GetStr(),
|
|
ClientId = cl.id,
|
|
ClientNumber = cl.Number,
|
|
ClientName = cl.Name,
|
|
//客户和交易员反方向
|
|
Money = tc.Amount * -1,
|
|
HappenDate = valueDate == DateTime.Now.Date ? DateTime.Now : valueDate,
|
|
State = ClientCashInCashOut.已确认,
|
|
//ee.OpenBankId = bc.id + "";
|
|
//ee.OpenBankCard = bc.Card;
|
|
TradeId = tc.TradeId,
|
|
TradeCashId = tc.id,
|
|
OptId = tc.OptId,
|
|
OptName = tc.OptName,
|
|
OptDate = tc.OptDate,
|
|
CreatorId = tc.OptId,
|
|
CreatorName = tc.OptName,
|
|
CreateDate = tc.OptDate,
|
|
Action = ClientCashInCashOut.系统操作_行权费,
|
|
TradeNumber = td.TradeNumber,
|
|
IsGroup = td.IsGroup
|
|
};
|
|
DbContext.ClientCashInCashOut.Add(ee);
|
|
DbContext.SaveChanges();
|
|
|
|
//Utilities.AddLog(tc.id, trade_cash.LogClass, "创建", "执行交割增加现金交割交易记录");
|
|
//Utilities.AddLog(ee.id, ClientCashInCashOut.LogClass, "创建", "执行交割增加应收账记录");
|
|
}
|
|
else
|
|
{
|
|
//到期交易增加一条交易金额为0的trade_cash记录 记录当时期末价格 以及行权费用
|
|
//修改交易状态
|
|
td.TradeStatus = ConsTrade.已到期;
|
|
|
|
//trade_cash
|
|
var tc = DbContext.trade_cash.FirstOrDefault(t => t.TradeId == td.id && t.Action == ClientCashInCashOut.系统操作_行权费 && t.ValidState != ConsGlobal.InValid && !t.IsDeleted);
|
|
|
|
if (tc == null)
|
|
{
|
|
tc = new trade_cash();
|
|
DbContext.trade_cash.Add(tc);
|
|
}
|
|
if (formData != null)
|
|
{
|
|
UpdateChanges(tc, formData);
|
|
}
|
|
|
|
tc.SpotPrice = tcspotPrice;
|
|
tc.ValidState = req.ValidState;
|
|
tc.OptId = UserId;
|
|
tc.OptName = UserName;
|
|
tc.OptDate = DateTime.Now;
|
|
tc.Action = ClientCashInCashOut.系统操作_行权费;
|
|
tc.IsLastAction = true;
|
|
tc.ValueDate = td.ExerciseDate.Value;
|
|
tc.FinalPrice = req.FinalPrice;
|
|
tc.Notional = td.Notional;
|
|
var CountRatio = UnderlyingDataProvider.GetCountRatio(td.UnderlyingCode);
|
|
tc.TradeAmount = tc.Notional / CountRatio;
|
|
tc.Amount = 0;
|
|
tc.ExtraAmount = req.ExtraAmount;
|
|
tc.Status = TradeCashStatusEnum.已执行;
|
|
tc.TradeType = td.BuySell;
|
|
tc.TradeId = req.TradeId;
|
|
tc.ExerciseWay = TradeCashExerciseWayEnum.到期行权;
|
|
DbContext.SaveChanges();
|
|
}
|
|
|
|
AddTradeOperationHistoryAndSetParentTradeInfo(false, td, "批量到期行权");
|
|
|
|
DbContext.SaveChanges();
|
|
|
|
//生成文档
|
|
if (PS.Config.IsAutoGenerateContracts)
|
|
{
|
|
new TradeContractGenerateService(this).GenerateContractsAsync(new List<int> { td.id });
|
|
}
|
|
}
|
|
}
|
|
}
|