| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354 |
- using System.Threading;
- using GalaSoft.MvvmLight.Ioc;
- using Muchinfo.MTPClient.Adapter.Abstract;
- using Muchinfo.MTPClient.Data.Enums;
- using Muchinfo.MTPClient.Data.Helper;
- using Muchinfo.MTPClient.Data.Model;
- using Muchinfo.MTPClient.Infrastructure.Helpers;
- using Muchinfo.MTPClient.Infrastructure.Utilities;
- using Muchinfo.MTPClient.IService;
- using Muchinfo.MTPClient.NetworkCore;
- using Muchinfo.MTPClient.NetworkCore.Interfaces;
- using System;
- using System.Linq;
- using System.Threading.Tasks;
- using Muchinfo.PC.Common.Extensions;
- using Muchinfo.MTPClient.Data;
- namespace Muchinfo.MTPClient.Infrastructure.LinkProxy.TCP
- {
- public class TradeTcpCallback : INetworkCore
- {
- /// <summary>
- /// The _message adapter
- /// </summary>
- private readonly MessageAdapter _messageAdapter;
- private TradeTcpLinkProxy _owner;
- /// <summary>
- /// Initializes a new instance of the <see cref="TradeTcpCallback"/> class.
- /// </summary>
- public TradeTcpCallback(TradeTcpLinkProxy owner)
- {
- _messageAdapter = LinkManager.Instance.TradeAdapterFactory.CreateMessageAdapter();
- _owner = owner;
- }
- /// <summary>
- /// 当与服务端连接成功时的回调方法
- /// </summary>
- public void OnConnected()
- {
- //todo:20160504-011
- // throw new NotImplementedException();
- }
- /// <summary>
- /// 当与服务端连接断开时的回调方法
- /// </summary>
- public void OnDisconnected()
- {
- //todo: 20160504 - 011
- //throw new NotImplementedException();
- }
- /// <summary>
- /// 当发生断网重连状态变化时的回调方法
- /// </summary>
- /// <param name="state">重连状态枚举值</param>
- public void OnReconnectChangeState(ReconnectChangeState state)
- {
- // throw new NotImplementedException();
- switch (state)
- {
- case ReconnectChangeState.BeginReconnect:
- // 开始重连
- MessengerHelper.DefaultSend(false, MessengerTokens.TradeServerConnectMsg);
- LogInfoHelper.WriteInfo("交易断线开始重新连接!");
- break;
- case ReconnectChangeState.ReconnectFailAndWaitPeriod:
- // 尝试重连失败,将在下一个周期时间后尝试重连
- MessengerHelper.DefaultSend(false, MessengerTokens.TradeServerConnectMsg);
- LogInfoHelper.WriteInfo("交易尝试重连失败,将在下一个周期时间后尝试重连!");
- break;
- case ReconnectChangeState.ReconnectSuccess:
- LogInfoHelper.WriteInfo("交易代理断线重连成功!");
- //启动发送心跳信号
- if (_owner != null)
- {
- _owner.StartSendBeat();
- }
- //发送链路状态到StatusBarControl
- MessengerHelper.DefaultSend(true, MessengerTokens.TradeServerConnectMsg);
- // 重连成功
- // 判断当前Token是否有效
- SimpleIoc.Default.GetInstance<ILoginService>().TokenCheck(new Action<int>((statue) =>
- {
- // Token校验成功, 重新查询资金等信息
- // MessengerHelper.DefaultSend(string.Empty, MessengerTokens.MoneyNoticeToken);
- //下载持仓单
- MessengerHelper.DefaultSend(UserManager.CurrentTradeAccount, MessengerTokens.OrderNotify);
- ////查询基本数据,包括了解查询资金.解决电脑休眠隔交易日重新连接后 涨跌停不正确问题,
- MessengerHelper.DefaultSend(string.Empty, MessengerTokens.UpdateCacheGoodsToken);
- }), (error) =>
- {
- MessengerHelper.DefaultSend(error, MessengerTokens.ConnectCheckedToken);
- });
- break;
- case ReconnectChangeState.NormalSuccess:
- // 正常连接成功
- MessengerHelper.DefaultSend(true, MessengerTokens.TradeServerConnectMsg);
- break;
- }
- }
- /// <summary>
- /// 当接收到服务端推送类报文时的回调方法
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="package">The package.</param>
- public void OnReceiveNotification<T>(T package)
- {
- //交易回调处理TCPPackage对象
- var tcpPackage = package as TCPPackage;
- if (tcpPackage == null || tcpPackage.Length <= 0 || tcpPackage.Content == null) return;
- switch (tcpPackage.FunCode)
- {
- case FuncCode.FID_OrderDealedNtf:
- LogInfoHelper.WriteInfo("收到单据成交通知");
- //TODO:不解包暂时不需要
-
- var orderComplete = _messageAdapter.ComplateNotice(tcpPackage.Content);
- //MessengerHelper.DefaultSend(UserManager.CurrentTradeAccount, MessengerTokens.OrderNoticeToken);
- //发送更新委托通知
- MessengerHelper.DefaultSend(UserManager.CurrentTradeAccount.FundsAccountId, MessengerTokens.ShowMOOrdersByCapitalAccount);
- LogInfoHelper.WriteInfo("单据成交通知单号:" + orderComplete.OrderId);
- break;
-
- case FuncCode.FID_OrderCanceledNtf:
- LogInfoHelper.WriteInfo("委托单撤单通知");
- //MessengerHelper.DefaultSend(UserManager.CurrentTradeAccount, MessengerTokens.OrderNoticeToken);
- //发送更新委托通知
- MessengerHelper.DefaultSend(UserManager.CurrentTradeAccount.FundsAccountId, MessengerTokens.ShowMOOrdersByCapitalAccount);
- break;
- case FuncCode.FID_OrderSuccessedNtf:
- LogInfoHelper.WriteInfo("委托单成功通知-多点登录");
- MessengerHelper.DefaultSend(UserManager.CurrentTradeAccount.FundsAccountId, MessengerTokens.ShowMOOrdersByCapitalAccount);
- MessengerHelper.DefaultSend(UserManager.CurrentTradeAccount.FundsAccountId, MessengerTokens.ShowMOTransactionByCapitalAccount);
- MessengerHelper.DefaultSend(UserManager.CurrentTradeAccount.FundsAccountId, MessengerTokens.ShowMOHolderByCapitalAccount);
- MessengerHelper.DefaultSend(UserManager.CurrentTradeAccount.FundsAccountId, MessengerTokens.ShowMOSPSLByCapitalAccount);
- if (LinkManager.Instance.QuoteTcpLinkProxy !=null) LinkManager.Instance.QuoteTcpLinkProxy.Subscribe();
- break;
- case FuncCode.FID_TradeDealedNtf:
- LogInfoHelper.WriteInfo("交易成交通知");
- //发送更新成交明细
- MessengerHelper.DefaultSend(UserManager.CurrentTradeAccount.FundsAccountId, MessengerTokens.ShowMOTransactionByCapitalAccount);
- break;
- //头寸变化通知
- case FuncCode.FID_PosChangedNtf:
- LogInfoHelper.WriteInfo("头寸变化通知");
- var orderPos = _messageAdapter.PosChangedReturnMessage(tcpPackage.Content);
- //MessengerHelper.DefaultSend(UserManager.CurrentTradeAccount, MessengerTokens.OrderNoticeToken);
- //发送更新头寸通知
- MessengerHelper.DefaultSend(orderPos.AccountID, MessengerTokens.ShowMOHolderByCapitalAccount);
- LogInfoHelper.WriteInfo("头寸变化通知商品ID号:" + orderPos.GoodsID);
- break;
- case FuncCode.FID_LogoutRsp:
- LogInfoHelper.WriteInfo("交易代理用户登出应答,离线!");
- //手动发送登出消息
- var service = SimpleIoc.Default.GetInstance<ILoginService>();
- if (service != null) service.TradeAccountLogout(UserManager.CurrentTradeAccount);
- var error= _messageAdapter.LogoutRspConvert(tcpPackage.Content);
- if (error.ReturnCode == 0) error.ReturnCode = 1009;
- MessengerHelper.DefaultSend(error, MessengerTokens.UserOfflineNoticeToken);
- break;
- case FuncCode.FID_MarketStatusChangeNtf:
- // 待开市通知则为结算下线
- var ntfModel = _messageAdapter.MarketStatusChangeNtf(tcpPackage.Content);
- if (ntfModel.Status == 1)
- {
- var service1 = SimpleIoc.Default.GetInstance<ILoginService>();
- if (service1 != null) service1.TradeAccountLogout(UserManager.CurrentTradeAccount);
- //var error1 = _messageAdapter.LogoutRspConvert(tcpPackage.Content);
- //if (error1.ReturnCode == 0) error1.ReturnCode = 1009;
- MessengerHelper.DefaultSend(RestartType.SttleLoginOut, MessengerTokens.UserOfflineNoticesSttle);
- LogInfoHelper.WriteInfo("市场状态变更通知,离线(结算)!");
- }
- break;
- case FuncCode.FID_MoneyChangedNtf:
- LogInfoHelper.WriteInfo("资金变化的通知");
- var amountArg = _messageAdapter.ConvertAmountNotice(tcpPackage.Content);
- Task.Factory.StartNew(() =>
- {
- MessengerHelper.DefaultSend(amountArg, MessengerTokens.MoneyNoticeToken);
- });
- break;
- ////
- case FuncCode.FID_CustOfflineNtf:
- LogInfoHelper.WriteInfo("通信超时失效!");
- MessengerHelper.DefaultSend(RestartType.LinkFail, MessengerTokens.UserOfflineNoticeToken);
- break;
- //公告消息推送
- case FuncCode.FID_BltMsgNtf:
- var notifyBulletin = _messageAdapter.NotifyBulletin(tcpPackage.Content);
- MessengerHelper.DefaultSend(notifyBulletin, MessengerTokens.AnnouncementMessage);
- break;
- //case FuncCode.FID_RiskControlMsg:
- // var notifyControlMsg = _messageAdapter.RiskCtrlMemberNotice(tcpPackage.Content);
- // notifyControlMsg.RiskMsgType = RiskMsgType.StatusChange;
- // LogInfoHelper.WriteInfo("风控通知,账号:"+notifyControlMsg.LoginCode);
- // MessengerHelper.DefaultSend(notifyControlMsg, MessengerTokens.RiskControl);
- // break;
- //case FuncCode.FID_RiskCtrlMemRsp:
- // //暂时不处理
- // var RiskCtrlMem = _messageAdapter.RiskCtrlMemberBreak(tcpPackage.Content);
- // RiskCtrlMem.RiskMsgType = RiskMsgType.BreakLevel;
- // RiskCtrlMem.RiskLevel = 3; ////服务器没有给级别,斩仓级别显示红色
- // LogInfoHelper.WriteInfo("斩仓通知,账号:" + RiskCtrlMem.LoginCode);
- // MessengerHelper.DefaultSend(RiskCtrlMem, MessengerTokens.RiskControl);
- // break;
- //预埋单
- //case FuncCode.FID_PrepostTransferOrderNtf:
- // var prepostTransfer = _messageAdapter.PrepostTransferOrderNtf(tcpPackage.Content);
- // //todo:更新预埋单 委托单
- // //var cacheData = UserManager.GetTradeCacheData(UserManager.CurrentTradeAccount.AccountId);
- // //cacheData.LimitOrderFlag = false;
- // MessengerHelper.DefaultSend(true, MessengerTokens.PreOrderUpdate);
- // LogInfoHelper.WriteInfo("收到预埋单转委托通知!");
- // break;
- ////投资者公告
- //case FuncCode.FID_RiskCtrlBltRsp:
- // var riskCtrlBltNotice = _messageAdapter.RiskCtrlBltNotice(tcpPackage.Content);
- // MessengerHelper.DefaultSend(riskCtrlBltNotice, MessengerTokens.RiskControl);
- // break;
- //操作变更通知
- //case FuncCode.FID_OperateChangeNotifyRsp:
- // var OperateChangeNotifyContent = _messageAdapter.OperateChangeNotifyAd(tcpPackage.Content);
- // AppMessengerHelper.OperateChangeNotifyMessage.Send(OperateChangeNotifyContent);
- // break;
- //开休市计划通知[Add By DK 20160629]
- //case FuncCode.FID_MarketStatusChangeNotify:
- // LogInfoHelper.WriteInfo("开休市计划通知,FunCode:" + FuncCode.FID_MarketStatusChangeNotify);
- // var MarketStatusChangeNotifyContent = _messageAdapter.MarketStatusChangeNotifyAd(tcpPackage.Content);
- // AppMessengerHelper.MarketStatusChangeNotifyMessage.Send(MarketStatusChangeNotifyContent);
- // break;
- //case FuncCode.FID_GoodsChangeNotifyRsp:
- // //todo:交易端暂时不区分单个商品内容的更新
- // MessengerHelper.DefaultSend(string.Empty, MessengerTokens.UpdateCacheGoodsToken);
- // LogInfoHelper.WriteInfo("商品状态更新,FID_GoodsChangeNotifyRsp:" + FuncCode.FID_GoodsChangeNotifyRsp);
- // break;
- //case FuncCode.FID_AccountChangeNotifyRsp:
- // var OperateChangeNotifyContent = _messageAdapter.AccountChangeNotifyRspNotifyAd(tcpPackage.Content);
- // MessengerHelper.DefaultSend(string.Empty, MessengerTokens.AccountParamChangeToken);
- // break;
- //case FuncCode.FID_DeliveryAuditNtf: //交收审核通知
- // var DeliveryAuditNtfContent = _messageAdapter.DeliveryReturnMessage(tcpPackage.Content);
- // LogInfoHelper.WriteInfo("交收审核通知,FID_DeliveryAuditNtf:" + FuncCode.FID_DeliveryAuditNtf + ", ReturnCode:" + DeliveryAuditNtfContent.RetCode);
- // MessengerHelper.DefaultSend(UserManager.CurrentTradeAccount, MessengerTokens.OrderNoticeToken);
- // break;
- //case FuncCode.FID_OutStoreAuditNtf: //提货审核通知
- // var OutStoreAuditNtfContent = _messageAdapter.OutStoreAuditReturnMessage(tcpPackage.Content);
- // LogInfoHelper.WriteInfo("提货审核通知,FID_OutStoreAuditNtf:" + FuncCode.FID_OutStoreAuditNtf + ", ReturnCode:" + OutStoreAuditNtfContent.RetCode);
- // MessengerHelper.DefaultSend(OutStoreAuditNtfContent, MessengerTokens.OutStoreAuditToken);
- // MessengerHelper.DefaultSend(UserManager.CurrentTradeAccount, MessengerTokens.OrderNoticeToken);
- // break;
- //case FuncCode.FID_GoodsCloseDateNtf: //交割商品到期提货通知
- // var GoodsCloseDateNtfContent = _messageAdapter.GoodsCloseDateReturnMessage(tcpPackage.Content);
- // LogInfoHelper.WriteInfo("交割商品到期提货通知,FID_GoodsCloseDateNtf:" + FuncCode.FID_GoodsCloseDateNtf + ", ReturnCode:" + GoodsCloseDateNtfContent.RetCode);
- // MessengerHelper.DefaultSend(GoodsCloseDateNtfContent, MessengerTokens.GoodsCloseDateToken);
- // break;
- //case FuncCode.FID_ListingBroadcastNtf: ////挂牌改价,数量改变,审核通知
- // var listingNtfContent = _messageAdapter.ToListingNoticeModel(tcpPackage.Content);
- // LogInfoHelper.WriteInfo("挂牌改价,数量改变,审核通知,FID_ListingBroadcastNtf :" + FuncCode.FID_ListingBroadcastNtf + ", ReturnCode:" + listingNtfContent.RetCode);
- // MessengerHelper.DefaultSend(listingNtfContent.Entity, MessengerTokens.ListingNotice);
- // break;
- //case FuncCode.FID_ListingNtf:
- // var delistingNtf = _messageAdapter.ToListingNoticeModel(tcpPackage.Content);
- // LogInfoHelper.WriteInfo("摘牌成交,FID_ListingNtf :" + FuncCode.FID_ListingNtf + ", ReturnCode:" + delistingNtf.RetCode);
- // MessengerHelper.DefaultSend(delistingNtf.Entity, MessengerTokens.DelistingCompleteNotice);
- // break;
- ////会员风控通知
- //case FuncCode.FID_RiskControlMember:
- // var RiskControlMemberContent = _messageAdapter.RiskControlMemberReturnMessage(tcpPackage.Content);
- // LogInfoHelper.WriteInfo("会员风控通知:" + FuncCode.FID_RiskControlMember + ", ReturnCode:" + RiskControlMemberContent.RetCode);
- // MessengerHelper.DefaultSend(RiskControlMemberContent, MessengerTokens.RiskControlMemberToken);
- // break;
- //投资者风控通知
- case FuncCode.FID_RiskToWebNtf:
- var RiskControlInvestorContent = _messageAdapter.RiskControlInvestorReturnMessage(tcpPackage.Content);
- LogInfoHelper.WriteInfo("投资者风控通知:" + FuncCode.FID_RiskControlNtf + ", ReturnCode:" + RiskControlInvestorContent.RetCode);
- MessengerHelper.DefaultSend(RiskControlInvestorContent, MessengerTokens.RiskControlInvestorToken);
- break;
- ////通用通知
- //case FuncCode.FID_CommonNotify:
- // var CommonNtfContent = _messageAdapter.CommonNotifyReturnMessage(tcpPackage.Content);
- // LogInfoHelper.WriteInfo("通用通知,通知标题:" + CommonNtfContent.Title + ", ReturnCode:" + CommonNtfContent.RetCode);
- // MessengerHelper.DefaultSend(CommonNtfContent, MessengerTokens.CommonMessageToken);
- // break;
- //case FuncCode.FID_CommonBroadcastNtf: ////通用广播通知
- // var massgerfuncode = _messageAdapter.ToMessageHeadFunCode(tcpPackage.Content);
- // PackageBroadNtf((int) massgerfuncode, tcpPackage.Content);
- // break;
- }
- }
- /// <summary>
- /// 解通知具体内容
- /// </summary>
- /// <param name="funcode"></param>
- /// <param name="buffer"></param>
- private void PackageBroadNtf(int funcode, byte[] buffer)
- {
- switch (funcode)
- {
- //case FuncCode.FID_MarketStatusRsp:
- // var massgerfuncode = _messageAdapter.ToMarketStatusRsp(buffer);
- // if (massgerfuncode.RetCode == 0) ////结算成功通知 更新单据
- // {
- // Task.Factory.TryStartNew(() =>
- // {
- // var random = new Random();
- // var second = random.Next(500, 3000);
- // Thread.Sleep(second);
- // MessengerHelper.DefaultSend(UserManager.CurrentTradeAccount,
- // MessengerTokens.OrderNoticeToken);
- // });
- // }
- // break;
- //case FuncCode.FID_ListingBroadcastNtf: ////挂牌改价,数量改变,审核通知
- // var listingNtfContent = _messageAdapter.ToListingNoticeModel(buffer);
- // LogInfoHelper.WriteInfo("挂牌改价,数量改变,审核通知,FID_ListingBroadcastNtf :" + FuncCode.FID_ListingBroadcastNtf + ", ReturnCode:" + listingNtfContent.RetCode);
- // MessengerHelper.DefaultSend(listingNtfContent.Entity, MessengerTokens.ListingNotice);
- // break;
- //case FuncCode.FID_ListingNtf:
- // var delistingNtf = _messageAdapter.ToListingNoticeModel(buffer);
- // LogInfoHelper.WriteInfo("摘牌成交,FID_ListingNtf :" + FuncCode.FID_ListingNtf + ", ReturnCode:" + delistingNtf.RetCode);
- // MessengerHelper.DefaultSend(delistingNtf.Entity, MessengerTokens.DelistingCompleteNotice);
- // break;
- default:
- break;
- }
- }
- }
- }
|