Example #1
0
 /// <summary>
 /// Validates the e record.
 /// </summary>
 /// <param name="eRecord">The e record.</param>
 /// <returns></returns>
 private static string ValidateERecord(ERecord eRecord)
 {
     if (eRecord != null)
     {
         //FIXED-NOV15 - Check null condition for eRecord else return string.Empty
         return(string.Format(CultureInfo.InvariantCulture, "{0} {1}",
                              ValidateClaimId(eRecord.ClaimId),
                              ValidateSecondaryDiagnosis(eRecord.SecondaryDiagnosisCodes)));
     }
     return(string.Empty);
 }
Example #2
0
        /// <summary>
        /// Gets the e record line.
        /// </summary>
        /// <param name="eRecordData">The e record data.</param>
        /// <returns></returns>
        public string GetERecordLine(ERecord eRecordData)
        {
            string eRecord = string.Empty;

            ValidationErrors = ValidateERecord(eRecordData);
            if (eRecordData != null && string.IsNullOrEmpty(ValidationErrors.Trim()))
            {
                eRecord = BuildERecordString(eRecordData);
            }
            return(eRecord);
        }
Example #3
0
        public string RefundTrade(String orderRef)
        {
            if (orderRef == null || orderRef == string.Empty)
            {
                return("非法委托编号!");
            }

            int reference = int.Parse(orderRef.Trim());

            ERecord srecord = EntrustRecord.GetEntrustRecord(reference);

            if (srecord != null)
            {
                //找到股票委托交易信息
                RefundStruct refund = new RefundStruct()
                {
                    Direction    = srecord.Direction.Trim(),
                    ExchangeId   = srecord.ExchangeId.Trim(),
                    OffSetFlag   = "0",
                    SecurityCode = srecord.Code,
                    SecurityType = "S",
                    OrderRef     = srecord.OrderRef.ToString(),
                    OrderSysId   = srecord.SysOrderRef
                };

                queue_refund_thread.GetQueue().Enqueue(refund);

                return("success");
            }

            RecordItem frecord = TradeRecord.GetInstance().getOrderInfo(reference);

            if (frecord != null)
            {
                //找到期货委托交易信息

                RefundStruct refund = new RefundStruct()
                {
                    Direction    = frecord.Orientation,
                    ExchangeId   = String.Empty,
                    OffSetFlag   = frecord.CombOffsetFlag.ToString(),
                    SecurityCode = frecord.Code,
                    SecurityType = "F",
                    OrderRef     = frecord.OrderRef.ToString(),
                    OrderSysId   = frecord.OrderSysID
                };

                queue_refund_thread.GetQueue().Enqueue(refund);
                return("success");
            }

            return("未找到委托对应交易!");
        }
        public void ValidateERecordIfSecondaryDiagnosisCodesIsNull()
        {
            //Arrange
            _target = new ERecordLogic();
            ERecord eRecordRaw = new ERecord
            {
                ClaimId                 = "1.04.2",
                AdmitDiagnosisCode      = "1.04.2",
                PrincipalDiagnosisCode  = "1.04.2",
                SecondaryDiagnosisCodes = null
            };

            //Act
            string actual = _target.GetERecordLine(eRecordRaw);

            //Assert
            Assert.AreEqual(actual, "");
        }
        public void ValidateERecordIfClaimIdIsInvalid()
        {
            _target = new ERecordLogic();
            ERecord eRecordRaw = new ERecord
            {
                ClaimId                 = "1.04.2260000000000000",
                AdmitDiagnosisCode      = "1256",
                PrincipalDiagnosisCode  = "3568",
                SecondaryDiagnosisCodes =
                    new List <string> {
                    "4444", "5555", "9981", "0381", "2918", "92", "30080", "5190", "5648", "7638", "30081", "5191", "5649", "7639"
                }
            };

            string actual = _target.GetERecordLine(eRecordRaw);

            Assert.AreEqual(actual, "");
        }
        public void BuildERecordIfSecondaryDiagnosisCodeIsNull()
        {
            //Arrange
            ERecord eRecordRaw = new ERecord
            {
                ClaimId                 = "1.04.2",
                AdmitDiagnosisCode      = "1.04.2",
                PrincipalDiagnosisCode  = "1.04.2",
                SecondaryDiagnosisCodes = null
            };

            const string expected =
                "E1.04.2           1042    1042                                                                                                                                                                          ";
            //Act
            string actual = ERecordLogic.BuildERecordString(eRecordRaw);

            //Assert
            Assert.AreEqual(actual, expected);
        }
Example #7
0
        public static string BuildERecordString(ERecord eRecord)
        {
            StringBuilder eRecordString = new StringBuilder(Constants.Stringlength);

            if (eRecord != null)
            {
                eRecordString = eRecordString.Append(Constants.ERecordString);
                eRecordString = eRecordString.Append(BuildClaimId(eRecord.ClaimId));
                eRecordString = eRecordString.Append(BuildAdminDiagnosis(eRecord.AdmitDiagnosisCode));
                eRecordString = eRecordString.Append(BuildPrincipalDiagnosis(eRecord.PrincipalDiagnosisCode));
                eRecordString = eRecordString.Append(BuildSecondaryDiagnosis(eRecord.SecondaryDiagnosisCodes));
                eRecordString = eRecordString.Append(BuildUnUsed());

                if (eRecordString.Length == Constants.Stringlength)
                {
                    return(eRecordString.ToString());
                }
                return(string.Format(CultureInfo.InvariantCulture, "{0,-200}", eRecordString));
            }
            return(string.Empty);
        }
        public void BuildERecordIfPrincipalDiagnosisCodeIsNull()
        {
            //Arrange
            ERecord eRecordRaw = new ERecord
            {
                ClaimId                 = "1.04.2",
                AdmitDiagnosisCode      = "1.04.2",
                PrincipalDiagnosisCode  = null,
                SecondaryDiagnosisCodes = new List <string> {
                    "4444", "5555", "9981", "0381", "2918", "92", "30080", "5190", "5648", "7638", "30081", "5191", "5649", "7639"
                }
            };

            const string expected =
                "E1.04.2           1042            4444    5555    9981    0381    2918    92      30080   5190    5648    7638    30081   5191    5649    7639                                                          ";
            //Act
            string actual = ERecordLogic.BuildERecordString(eRecordRaw);

            //Assert
            Assert.AreEqual(actual, expected);
        }
        public void BuildERecordStringTestForNone()
        {
            //Arrange
            ERecord eRecordRaw = new ERecord
            {
                ClaimId                 = "422379168",
                AdmitDiagnosisCode      = "1256",
                PrincipalDiagnosisCode  = "NONE",
                SecondaryDiagnosisCodes =
                    new List <string> {
                    "4444", "5555", "9981", "0381", "2918", "9223", "30080", "5190", "5648", "7638"
                }
            };
            const string expected =
                "E422379168        1256            4444    5555    9981    0381    2918    9223    30080   5190    5648    7638                                                                                          ";

            //Act
            string actual = ERecordLogic.BuildERecordString(eRecordRaw);

            //Assert
            Assert.AreEqual(expected, actual);
        }
        public void ValidateERecordIfClaimIdIsNull()
        {
            //Arrange
            _target = new ERecordLogic();
            ERecord eRecordRaw = new ERecord
            {
                ClaimId                 = null,
                AdmitDiagnosisCode      = "1.04.2",
                PrincipalDiagnosisCode  = "1.04.2",
                SecondaryDiagnosisCodes = new List <string> {
                    "4444", "5555", "9981", "0381", "2918", "92", "30080", "5190", "5648", "7638", "30081", "5191", "5649", "7639"
                }
            };

            const string expected =
                "E                 1042    1042    4444    5555    9981    0381    2918    92      30080   5190    5648    7638    30081   5191    5649    7639                                                          ";
            //Act
            string actual = _target.GetERecordLine(eRecordRaw);

            //Assert
            Assert.AreEqual(actual, expected);
        }
        public void BuildERecordStringTestForSecondaryDiagnosisCodeIfCountIsGreaterThenFourteen()
        {
            //Arrange
            ERecord eRecordRaw = new ERecord
            {
                ClaimId                 = "422379168",
                AdmitDiagnosisCode      = "1256",
                PrincipalDiagnosisCode  = "3568",
                SecondaryDiagnosisCodes =
                    new List <string> {
                    "4444789", "5555", "9981", "0381", "2918", "9223256354", "30080", "5190", "5648", "7638", "30081", "5191", "5649", "7639", "4444789", "5555", "9981", "0381", "2918", "9223256354", "30080", "5190", "5648", "7638", "30081", "5191", "5649", "7639"
                }
            };
            const string expected =
                "E422379168        1256    3568    4444789 5555    9981    0381    2918    9223256330080   5190    5648    7638    30081   5191    5649    7639                                                          ";

            //Act
            string actual = ERecordLogic.BuildERecordString(eRecordRaw);

            //Assert
            Assert.AreEqual(expected, actual);
        }
        public void BuildERecordStringForGeaterThan()
        {
            //Arrange
            ERecord eRecordRaw = new ERecord
            {
                ClaimId                 = "1.04.223213265525888536",
                AdmitDiagnosisCode      = "1.04.2",
                PrincipalDiagnosisCode  = "1.04.2",
                SecondaryDiagnosisCodes =
                    new List <string> {
                    "4444", "5555", "9981", "0381", "2918", "92", "30080", "5190", "5648", "7638", "30081", "5191", "5649", "7639"
                }
            };
            const string expected =
                "E1.04.2232132655258885361042    1042    4444    5555    9981    0381    2918    92      30080   5190    5648    7638    30081   5191    5649    7639                                                          ";

            //Act
            string actual = ERecordLogic.BuildERecordString(eRecordRaw);

            //Assert
            Assert.AreEqual(expected, actual);
        }
        public void ValidateERecordIfSecondaryDiagnosisLengthIsInvalid()
        {
            //Arrange
            _target = new ERecordLogic();
            ERecord eRecordRaw = new ERecord
            {
                ClaimId                 = "422379168",
                AdmitDiagnosisCode      = "1256",
                PrincipalDiagnosisCode  = "3568",
                SecondaryDiagnosisCodes =
                    new List <string> {
                    "4444000", "5555", "9981", "0381", "2918", "92", "30080", "5190", "5648", "7638", "30081", "5191", "5649", "7639", "256363"
                }
            };
            const string expected =
                "E422379168        1256    3568    4444000 5555    9981    0381    2918    92      30080   5190    5648    7638    30081   5191    5649    7639                                                          ";
            //Act
            string actual = _target.GetERecordLine(eRecordRaw);

            //Assert
            Assert.AreEqual(actual, expected);
        }
        public void GetERecordStringForGeaterThan200Length()
        {
            //Arrange
            _target = new ERecordLogic();
            ERecord eRecordRaw = new ERecord
            {
                ClaimId                 = "1.04.223213265525888536",
                AdmitDiagnosisCode      = "1.04.2",
                PrincipalDiagnosisCode  = "1.04.2",
                SecondaryDiagnosisCodes =
                    new List <string> {
                    "4444", "5555", "9981", "0381", "2918", "92", "30080", "5190", "5648", "7638", "30081", "5191", "5649", "7639"
                }
            };
            const int expected = 200;

            //Act
            int actual = _target.GetERecordLine(eRecordRaw).Length;

            //Assert
            Assert.AreNotEqual(expected, actual);
        }
Example #15
0
        /// <summary>
        /// 执行交易线程处理逻辑
        /// 包含功能:
        ///     1. 连接股票交易所(上海,深圳)
        ///     2. 心跳包发送/接收
        ///     3. 发送交易,等待响应
        /// </summary>
        private static void StockTradeSubThreadProc(object para)
        {
            MCStockLib.managedStockClass _classTradeStock = new managedStockClass();
            MCStockLib.managedLogin      login            = new managedLogin(CommConfig.Stock_ServerAddr, CommConfig.Stock_Port, CommConfig.Stock_Account, CommConfig.Stock_BrokerID, CommConfig.Stock_Password, CommConfig.Stock_InvestorID);
            string ErrorMsg = string.Empty;

            bool           DebugMark = false;                //测试交易标志
            StockTradeTest test      = new StockTradeTest(); //测试类

            //令该线程为前台线程
            Thread.CurrentThread.IsBackground = true;

            TradeParaPackage _tpp = (TradeParaPackage)para;

            //当前线程编号
            int _threadNo = _tpp._threadNo;

            sublog.LogEvent("线程 :" + _threadNo.ToString() + " 开始执行");
            //用作发送心跳包的时间标记
            DateTime _markedTime     = DateTime.Now;
            DateTime lastmessagetime = DateTime.Now;

            //初始化通信
            //功能1
            _classTradeStock.Init(login, ErrorMsg);

            while (true)
            {
                Thread.Sleep(10);
                if ((DateTime.Now - GlobalHeartBeat.GetGlobalTime()).TotalMinutes > 10)
                {
                    sublog.LogEvent("线程 :" + _threadNo.ToString() + "心跳停止 , 最后心跳 : " + GlobalHeartBeat.GetGlobalTime().ToString());
                    break;
                }

                //Thread.CurrentThread.stat
                if (_markedTime.Minute != DateTime.Now.Minute)
                {
                    //发送心跳包
                    //功能2
                    //_stockTradeAPI.heartBeat();
                    _classTradeStock.HeartBeat();
                    _markedTime = DateTime.Now;
                }

                if (lastmessagetime.Second != DateTime.Now.Second)
                {
                    KeyValuePair <string, object> message1 = new KeyValuePair <string, object>("THREAD_STOCK_TRADE_WORKER", (object)_threadNo);
                    try
                    {
                        queue_system_status.GetQueue().Enqueue((object)message1);
                        lastmessagetime = DateTime.Now;
                    }
                    catch
                    {
                        //do nothing
                    }
                }


                //if (!_classTradeStock.getConnectStatus())
                //{
                //    _classTradeStock.Init(login, ErrorMsg);
                //}

                if (queue_stock_excuteThread.GetQueue(_threadNo).Count < 2)
                {
                    queue_stock_excuteThread.SetThreadFree(_threadNo);
                }

                if (queue_stock_excuteThread.GetQueue(_threadNo).Count > 0)
                {
                    List <TradeOrderStruct> Queuetrades = (List <TradeOrderStruct>)queue_stock_excuteThread.StockExcuteQueues[_threadNo].Dequeue();

                    List <TradeOrderStruct> trades = new List <TradeOrderStruct>();

                    int eni = 0;
                    while (true)
                    {
                        try
                        {
                            TradeOrderStruct trade = Queuetrades[eni];
                            trades.Add(new TradeOrderStruct()
                            {
                                belongStrategy      = trade.belongStrategy,
                                cExhcnageID         = trade.cExhcnageID,
                                cOffsetFlag         = trade.cOffsetFlag,
                                cOrderexecutedetail = trade.cOrderexecutedetail,
                                cOrderLevel         = trade.cOrderLevel,
                                cOrderPriceType     = trade.cOrderPriceType,
                                cSecurityCode       = trade.cSecurityCode,
                                cSecurityType       = trade.cSecurityType,
                                cTradeDirection     = trade.cTradeDirection,
                                cUser           = trade.cUser,
                                dOrderPrice     = trade.dOrderPrice,
                                nSecurityAmount = trade.nSecurityAmount,
                                OrderRef        = trade.OrderRef,
                                SecurityName    = trade.SecurityName
                            });
                            eni++;
                        }
                        catch
                        {
                            break;
                        }
                    }


                    Guid tradeuuid = Guid.NewGuid();

                    if (trades == null || trades.Count == 0)
                    {
                        continue;
                    }

                    if (trades[0].cUser == DebugMode.TestUser)
                    {
                        DebugMark = true;
                    }
                    else
                    {
                        DebugMark = false;
                    }

                    if (trades.Count > 0)
                    {
                        sublog.LogEvent("线程 :" + _threadNo.ToString() + " 执行交易数量 : " + trades.Count);
                    }

                    if (!_classTradeStock.getConnectStatus())
                    {
                        _classTradeStock.Init(login, ErrorMsg);
                    }

                    //根据消息队列中发来的消息数量判断调用的接口
                    //当内容大于1 ,调用批量接口
                    //当内容等于1, 调用单笔接口
                    queue_stock_excuteThread.SetUpdateTime(_threadNo);
                    List <QueryEntrustOrderStruct_M> entrustorli = new List <QueryEntrustOrderStruct_M>();

                    if (trades.Count > 1)
                    {
                        //trades
                        Random seed = new Random();
                        sublog.LogEvent("线程 :" + _threadNo.ToString() + "进入执行环节 , 忙碌状态: " + queue_stock_excuteThread.GetThreadIsAvailiable(_threadNo));

                        TradeOrderStruct_M[] tradesUnit = new TradeOrderStruct_M[15];
                        int i = 0;
                        QueryEntrustOrderStruct_M[] entrustUnit = new QueryEntrustOrderStruct_M[15];
                        string s = string.Empty;
                        foreach (TradeOrderStruct unit in trades)
                        {
                            tradesUnit[i] = CreateTradeUnit(unit);
                            i++;
                        }

                        string user = trades[0].cUser;

                        //GlobalTestLog.LogInstance.LogEvent("线程 :" + _threadNo.ToString() +  " 发送交易: " + tradeuuid.ToString() + " 时间: " + DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss") + " : " + DateTime.Now.Millisecond.ToString());

                        if (DebugMark == true)
                        {
                            test.BatchTradeTest(tradesUnit, trades.Count, out entrustUnit, out s);
                        }
                        else
                        {
                            entrustUnit = _classTradeStock.BatchTrade(tradesUnit, trades.Count, s);
                        }

                        //GlobalTestLog.LogInstance.LogEvent("线程 :" + _threadNo.ToString() +  " 收到交易回报: " + tradeuuid.ToString() + " 时间: " + DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss") + " : " + DateTime.Now.Millisecond.ToString());

                        if (entrustUnit != null && entrustUnit.ToList().Count() > 0)
                        {
                            i = -1;
                            foreach (QueryEntrustOrderStruct_M unit in entrustUnit.ToList())
                            {
                                i++;
                                if (unit == null)
                                {
                                    continue;
                                }

                                if (unit.OrderSysID != null && unit.OrderSysID != String.Empty && unit.OrderSysID != "0")
                                {
                                    entrustorli.Add(unit);
                                }
                                else
                                {
                                    //委托失败处理
                                    GlobalErrorLog.LogInstance.LogEvent("获取委托号失败!用户: " + user + ",代码:" + unit.Code);
                                }



                                if (unit.Direction == 49)
                                {
                                    //清除风控冷冻金额
                                    //只有股票买入,才需要移除风控列表
                                    accountMonitor.UpdateRiskFrozonAccount(user, unit.Code, tradesUnit[i].SecurityAmount * (-1), tradesUnit[i].SecurityAmount * tradesUnit[i].OrderPrice * (-1), "S", "0");
                                }
                            }
                        }
                    }
                    else if (trades.Count == 1)
                    {
                        //trades
                        Random seed = new Random();

                        TradeOrderStruct_M tradesUnit = CreateTradeUnit(trades[0]);

                        QueryEntrustOrderStruct_M entrustUnit = new QueryEntrustOrderStruct_M();
                        string s = string.Empty;

                        string user = trades[0].cUser;

                        //GlobalTestLog.LogInstance.LogEvent("发送交易: " + tradeuuid.ToString() + " 时间: " + DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss") + " : " + DateTime.Now.Millisecond.ToString());

                        if (DebugMark == true)
                        {
                            test.SingleTradeTest(tradesUnit, out entrustUnit, out s);
                        }
                        else
                        {
                            _classTradeStock.SingleTrade(tradesUnit, entrustUnit, s);
                        }

                        //GlobalTestLog.LogInstance.LogEvent("收到交易回报: " + tradeuuid.ToString() + " 时间: " + DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss") + " : " + DateTime.Now.Millisecond.ToString());

                        if (entrustUnit.OrderSysID != null && entrustUnit.OrderSysID != String.Empty && entrustUnit.OrderSysID != "0")
                        {
                            entrustorli.Add(entrustUnit);
                        }
                        else
                        {
                            //委托失败处理
                            GlobalErrorLog.LogInstance.LogEvent("获取委托号失败!用户: " + user + ",代码:" + tradesUnit.SecurityCode);
                        }

                        if (entrustUnit.Direction.ToString() == TradeOrientationAndFlag.StockTradeDirectionBuy)
                        {
                            //清除风控冷冻金额,只有买入需要清除风控列表
                            accountMonitor.UpdateRiskFrozonAccount(user, tradesUnit.SecurityCode, tradesUnit.SecurityAmount * (-1), tradesUnit.SecurityAmount * tradesUnit.OrderPrice * (-1), "S", tradesUnit.TradeDirection.ToString());
                        }
                    }

                    //*********************************
                    //  交易成功后执行的特殊处理
                    //  交易生成委托存入数据库,并将委托送往查询成交线程
                    //*********************************
                    if (trades.Count != 0)
                    {
                        //存入数据库
                        if (entrustorli.Count() == 0)
                        {
                            continue;
                        }

                        for (int i = 0; i < trades.Count; i++)
                        {
                            entrustorli[i].Code         = trades[i].cSecurityCode;
                            entrustorli[i].StrategyId   = trades[0].belongStrategy;
                            entrustorli[i].Direction    = Convert.ToInt32(trades[i].cTradeDirection);
                            entrustorli[i].OrderRef     = Convert.ToInt32(trades[i].OrderRef);
                            entrustorli[i].OrderPrice   = trades[i].dOrderPrice;
                            entrustorli[i].SecurityType = (sbyte)115;
                            entrustorli[i].User         = trades[i].cUser;
                            ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.CreateERRecord), (object)(entrustorli[i]));
                            queue_query_entrust.GetQueue().Enqueue((object)entrustorli[i]);
                            ERecord record = new ERecord()
                            {
                                UserName    = trades[i].cUser,
                                Amount      = trades[i].nSecurityAmount,
                                Code        = trades[i].cSecurityCode,
                                ExchangeId  = trades[i].cExhcnageID,
                                OrderPrice  = trades[i].dOrderPrice,
                                OrderRef    = trades[i].OrderRef,
                                StrategyNo  = trades[i].belongStrategy,
                                SysOrderRef = entrustorli[i].OrderSysID,
                                Direction   = trades[i].cTradeDirection
                            };

                            EntrustRecord.AddEntrustRecord(record);
                        }
                    }
                }
            }

            //线程结束
            Thread.CurrentThread.Abort();
        }