131 lines
5.3 KiB
C#
131 lines
5.3 KiB
C#
using Newtonsoft.Json;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using YLErp.Abstract;
|
|
using YLErp.BLL;
|
|
using YLErp.BLL.Eod;
|
|
using YLErp.DataBase;
|
|
using YLErp.DBModels;
|
|
using YLErp.Helpers;
|
|
using YLErp.Model;
|
|
using YLErp.Model.Enum;
|
|
using YLErp.Model.HengTaiModel;
|
|
using YLErp.Modules.ExchangeTradeModule;
|
|
|
|
namespace YLErp.Modules.SwapModule
|
|
{
|
|
public class TRSHedgingOrderService : YLBaseService
|
|
{
|
|
private IKafkaProduce kafkaProduceHelper;
|
|
public TRSHedgingOrderService(OptUserInfo optUser) : base(optUser)
|
|
{
|
|
}
|
|
public void SetKafKaProduce(IKafkaProduce kafkaProduce)
|
|
{
|
|
kafkaProduceHelper = kafkaProduce;
|
|
}
|
|
/// <summary>
|
|
/// Trs对冲交易接口
|
|
/// </summary>
|
|
/// <param name="_kafkaConsumer"></param>
|
|
public void ConsumerTrsHedgingOrderCancel(KafkaConsumerHelper _kafkaConsumer)
|
|
{
|
|
_kafkaConsumer.Subscribe(msg =>
|
|
{
|
|
if (!string.IsNullOrEmpty(msg))
|
|
{
|
|
Result dealResult = new Result();
|
|
HedgingOrderCancelResp hedgingOrderCancelResp = new HedgingOrderCancelResp();
|
|
var result = JsonHelper.Deserialize<HedgingOrderCancelReq>(msg);
|
|
if (result == null)
|
|
{
|
|
dealResult.success = false;
|
|
dealResult.msg = "请求参数错误";
|
|
return;
|
|
}
|
|
try
|
|
{
|
|
dealResult.success = true;
|
|
hedgingOrderCancelResp.trs_deal_id = result.trs_deal_id;
|
|
var flow = GetSwapFlowByTrsDealId(result.trs_deal_id);
|
|
CancelHedgingOrder(flow, hedgingOrderCancelResp, result.trs_deal_no);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
dealResult.success = false;
|
|
dealResult.msg = e.Message;
|
|
LogFactory.GetLogger("TRSHedgingOrderService").Error("TRS对冲交易撤单接口", e);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
/// <summary>
|
|
/// 获取流水
|
|
/// </summary>
|
|
/// <param name="trs_deal_id"></param>
|
|
/// <returns></returns>
|
|
/// <exception cref="Exception"></exception>
|
|
private swap_flow GetSwapFlowByTrsDealId(long trs_deal_id)
|
|
{
|
|
var swapFlow = DbContext.swap_flow.Where(x => x.trs_deal_id == trs_deal_id).AsNoTracking().FirstOrDefault();
|
|
if (swapFlow == null)
|
|
{
|
|
throw new Exception($"根据{trs_deal_id}找不到对应流水");
|
|
}
|
|
if (swapFlow.OccurTime < DateTime.Now.Date)
|
|
{
|
|
throw new Exception($"对冲交易时间不是当日不能撤单");
|
|
}
|
|
return swapFlow;
|
|
}
|
|
/// <summary>
|
|
/// 撤单
|
|
/// </summary>
|
|
/// <param name="swapFlow"></param>
|
|
/// <param name="hedgingOrderCancelResp"></param>
|
|
/// <returns></returns>
|
|
private void CancelHedgingOrder(swap_flow swapFlow, HedgingOrderCancelResp hedgingOrderCancelResp, string trs_deal_no)
|
|
{
|
|
List<int> tradeIds=new List<int>();
|
|
if (swapFlow.DataState == (int)SwapFlowDateStateEnum.完成)
|
|
{
|
|
var swapEvents = DbContext.swap_event.Where(x => x.EventReason.Contains("自动") && x.ValueDate == swapFlow.OccurTime).AsNoTracking();
|
|
tradeIds = swapEvents.Select(s => s.SwapTradeId).ToList();
|
|
var swaptrades = DbContext.trade.Where(x => tradeIds.Contains(x.id) && x.ClientId == swapFlow.ClientId && x.UnderlyingCode == swapFlow.UnderlyingCode && x.ValidState != ConsGlobal.InValid).AsNoTracking().ToList();
|
|
tradeIds = swaptrades.Select(s => s.id).ToList();
|
|
new SwapTradeAutoService(OptUserInfo.SystemUser).ResetTradeByDate(swapFlow.OccurTime.Value, swapFlow.ClientId, swapFlow.UnderlyingCode, null, tradeIds);
|
|
}
|
|
var _swapFlow = DbContext.swap_flow.Where(x => x.trs_deal_id == swapFlow.trs_deal_id).FirstOrDefault();
|
|
if (_swapFlow != null)
|
|
{
|
|
DbContext.swap_flow.Remove(_swapFlow);
|
|
DbContext.SaveChanges();
|
|
Task.Run(() =>
|
|
{
|
|
RealtimePnlCalc.RealtimeSwapPosition(new OptUserInfo(0, "互换实时持仓服务", OptUserFrom.Service));
|
|
});
|
|
}
|
|
hedgingOrderCancelResp.code = (int)HedingOrderCancelEnum.撤单成功;
|
|
RebackExchangeTrade(trs_deal_no);
|
|
}
|
|
/// <summary>
|
|
/// 删除对冲交易记录
|
|
/// </summary>
|
|
/// <param name="trs_deal_no"></param>
|
|
private void RebackExchangeTrade(string trs_deal_no)
|
|
{
|
|
var extradeTrade = DbContext.ExchangeTrade.Where(x => x.TradeNumber == trs_deal_no).AsNoTracking().FirstOrDefault();
|
|
if (extradeTrade == null)
|
|
{
|
|
return;
|
|
}
|
|
var service = new ExchangeTradeSaveService(UserInfo);
|
|
service.InValidTrade(extradeTrade.id);
|
|
}
|
|
}
|
|
}
|