Files
zszq-trs/YLErpDAL/Modules/SwapModule/TRSHedgingOrderService.cs
T

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);
}
}
}