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.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; } /// /// Trs对冲交易接口 /// /// public void ConsumerTrsHedgingOrderCancel(KafkaConsumerHelper _kafkaConsumer) { _kafkaConsumer.Subscribe(msg => { if (!string.IsNullOrEmpty(msg)) { Result dealResult = new Result(); HedgingOrderCancelResp hedgingOrderCancelResp = new HedgingOrderCancelResp(); var result = JsonHelper.Deserialize(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); } } }); } /// /// 获取流水 /// /// /// /// 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; } /// /// 撤单 /// /// /// /// private void CancelHedgingOrder(swap_flow swapFlow, HedgingOrderCancelResp hedgingOrderCancelResp, string trs_deal_no) { List tradeIds=new List(); 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); } /// /// 删除对冲交易记录 /// /// 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); } } }