Esempio n. 1
0
        /// <summary>
        /// Scrap this instance.
        /// </summary>
        public TaskResult Extract(TransactionParameter transactionParameter)
        {
            Logger.Info("initiating extraction");
            //var transactionScraperResult = await _transactionScraper.Scrape(_webDriver);
            //var portfolioScraperResult = await _portfolioScraper.Scrape(_webDriver);
            try
            {
                var result = _brokerActor.Do(transactionParameter);
                return(result);

                /*{
                 *  IsSuccessful = //transactionScraperResult.IsSuccessful.Value &&
                 *      //portfolioScraperResult.IsSuccessful.Value
                 *      //brokerTransactionScraper.IsSuccessful
                 *      true
                 * };*/
            }
            catch (Exception e)
            {
                Logger.Error(e);
                throw;
            }

            Logger.Info("task completed");
            return(new TaskResult {
                IsSuccessful = true
            });
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="transactionParameter"></param>
        /// <returns></returns>
        public TaskResult Simulate(TransactionParameter transactionParameter)
        {
            var symbol = transactionParameter.Symbol;
            var from   = transactionParameter.GetFromDate();
            var to     = transactionParameter.GetToDate();
            var input  = _webDriver.FindElement(By.Id(Constants.InputId));

            input.Clear();
            input.SendKeys(symbol);

            Logger.Info($"setting stock name: {symbol} success");

            var dateFromSelect = new SelectElement(_webDriver.FindElement(By.Name(Constants.DateFromSelectName)));

            dateFromSelect.SelectByValue(from.Value.ToString("yyyy/MM/dd"));

            var dateToSelect = new SelectElement(_webDriver.FindElement(By.Name(Constants.DateToSelectName)));

            dateToSelect.SelectByValue(to.Value.ToString("yyyy/MM/dd"));

            _webDriver.FindElement(By.Id("bsubmit")).Submit();
            Logger.Info($"setting date to value success");

            _webDriver.SwitchTo().ParentFrame();
            _webDriver.SwitchTo().Frame(_webDriver.FindElement(By.Name("brokertrxnout2")));
            Logger.Info("awoken from sleep.");
            return(new TaskResult {
                IsSuccessful = true
            });
        }
Esempio n. 3
0
 public string ExtractTransactions([FromBody] TransactionParameter transactionParameter)
 {
     try
     {
         _extractor.Extract(transactionParameter);
     }
     catch (Exception e)
     {
         Logger.Error(e);
         return(e.Message);
     }
     return($"transaction {transactionParameter.Frequency} extraction complete");
 }
        /// <summary>
        ///
        /// </summary>
        /// <param name="rows"></param>
        /// <param name="transactionParameter"></param>
        /// <returns></returns>
        public BrokerTransactionBuilder Build(List <IWebElement> rows,
                                              TransactionParameter transactionParameter)
        {
            var date              = transactionParameter.GetFromDate();
            var symbol            = transactionParameter.Symbol;
            var brokerTransaction = new BrokerTransaction
            {
                Id          = $"{symbol}-{date:yyyyMMMdd}",
                Symbol      = symbol,
                CreatedDate = date
            };

            foreach (var row in rows)
            {
                var columns = row.FindElements(By.TagName("td"));
                try
                {
                    var code        = columns[1].Text;
                    var buyVolume   = columns[3].Text;
                    var buyAmount   = columns[4].Text;
                    var buyAverage  = columns[5].Text;
                    var sellVolume  = columns[6].Text;
                    var sellAmount  = columns[7].Text;
                    var sellAverage = columns[8].Text;
                    var netAmount   = columns[9].Text;
                    var totalValue  = columns[10].Text;

                    var brokerTransactionDetail = new BrokerTransactionDetail
                    {
                        Code        = code,
                        BuyVolume   = decimal.Parse(buyVolume),
                        BuyAmount   = decimal.Parse(buyAmount),
                        BuyAverage  = decimal.Parse(buyAverage),
                        SellVolume  = decimal.Parse(sellVolume),
                        SellAmount  = decimal.Parse(sellAmount),
                        SellAverage = decimal.Parse(sellAverage),
                        NetAmount   = decimal.Parse(netAmount),
                        TotalValue  = decimal.Parse(totalValue)
                    };
                    brokerTransaction.Details.Add(brokerTransactionDetail);
                }
                catch (WebDriverException e)
                {
                    Logger.Error("error has been encountered trying to retrieve broker infos from columns.", e);
                    throw;
                }
            }
            Transactions.Add(brokerTransaction);
            Logger.Info($"created brokerTransaction: {brokerTransaction}");
            return(this);
        }
Esempio n. 5
0
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public TaskResult Do(TransactionParameter transactionParameter)
        {
            var isBackOfficeException = false;
            var sleepInterval         = 5;

            _importProcessor.PurgeTrackers(transactionParameter);
            while (true)
            {
                if (isBackOfficeException)
                {
                    Logger.Info($"Performing sleep for {sleepInterval} minutes");
                    Thread.Sleep(TimeSpan.FromMinutes(sleepInterval));
                    sleepInterval *= 2;
                    Logger.Info("awoken from sleep");
                }

                _batchProcessor.SkipCounter = 0;
                foreach (var taskActor in _taskActors)
                {
                    var batch = _batchProcessor
                                .Process(ImportMode.Batch)
                                .GetData <List <Import> >();
                    if (batch.Count == 0)
                    {
                        continue;
                    }
                    Thread.Sleep(TimeSpan.FromSeconds(30));
                    taskActor.Do(batch, transactionParameter);
                }

                isBackOfficeException = _taskProcessor
                                        .Process()
                                        .IsSuccessful
                                        .Value;

                _taskProcessor.Dispose();

                var isCompleted = _importProcessor.IsCompleted();
                if (isCompleted)
                {
                    break;
                }
                //send signal to recovery actor
            }

            return(new TaskResult {
                IsSuccessful = true
            });
        }
Esempio n. 6
0
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public TaskResult Do(List <Import> batch, TransactionParameter transactionParameter)
        {
            TaskInstance = Task
                           .Factory
                           .StartNew(() => _brokerTransactionScraper.Scrape(transactionParameter, batch, WebDriverInstance),
                                     _cancellationTokenSource.Token);
            var symbols = string.Join(",", batch.Select(b => b.Symbol));

            Logger.Info($"Thread id: { TaskInstance.Id } will processing the following symbols: { symbols }");
            LogicalThreadContext.Properties["thread-id"] = TaskInstance.Id;

            return(new TaskResult {
                IsSuccessful = true
            });
        }
Esempio n. 7
0
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public TaskResult Do(TransactionParameter transactionParameter)
        {
            var isBackOfficeException = false;
            var sleepInterval         = 5;

            while (true)
            {
                if (isBackOfficeException)
                {
                    Logger.Info($"Performing sleep for {sleepInterval} minutes");
                    Thread.Sleep(TimeSpan.FromMinutes(sleepInterval));
                    sleepInterval *= 2;
                    Logger.Info("awoken from sleep");
                }


                var batch = new List <Import> {
                    new Import {
                        Symbol = transactionParameter.Symbol
                    }
                };
                var taskResult = _taskActor.Do(batch, transactionParameter);
                Logger.Info($"Thread id: {_taskActor.TaskInstance.Id} will processing the following symbols: { transactionParameter.Symbol }");
                _taskProcessor.AddTask(_taskActor);
                isBackOfficeException = _taskProcessor
                                        .Process()
                                        .IsSuccessful.Value;

                if (taskResult.IsSuccessful.Value)
                {
                    break;
                }
            }
            _taskActor.Dispose();

            var importTracker = _importTrackerRepository
                                .GetAll()
                                .GetData <List <ImportTracker> >()
                                .ToList()
                                .First(x => x.Equals(new ImportTracker(transactionParameter.Symbol)));

            importTracker.Status = "Success";
            _importTrackerRepository.PutAsync(importTracker);

            return(new TaskResult {
                IsSuccessful = true
            });
        }
        /// <summary>
        ///
        /// </summary>
        public void PurgeTrackers(TransactionParameter transactionParameter)
        {
            var importsHistory = _importHistoryRepository
                                 .GetByDate(DateTime.Now)
                                 .GetData <ImportHistory>();

            if (importsHistory == null || (transactionParameter.FromDate != null && transactionParameter.ToDate != null))
            {
                var importTrackersResponse = _importTrackerRepository.GetAll();
                var importTrackers         = importTrackersResponse.GetData <List <ImportTracker> >();
                foreach (var importTracker in importTrackers)
                {
                    _importTrackerRepository.DeleteAsync(importTracker);
                }
            }
            Logger.Info($"purge completed.");
        }
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public TaskResult Scrape(TransactionParameter transactionParameter,
                                 List <Import> batch,
                                 IWebDriver webDriver)
        {
            try
            {
                var loginNavigator = new LoginNavigator(webDriver);
                loginNavigator.Navigate();

                var loginSimulator = new LoginSimulator(webDriver, transactionParameter);
                loginSimulator.Simulate();

                Logger.Info("initiating broker navigator");
                var brokerTabNavigator = new BrokerTabNavigator(webDriver);
                Logger.Info("broker navigation in progress");
                brokerTabNavigator.Navigate();
                Logger.Info("initiating table scraper");

                var brokerTableScraper = new BrokerTableScraper(batch.ToList(),
                                                                new BrokerTransactionBuilder(),
                                                                new BrokerTransactionProcessor(_brokerTransactionRepository),
                                                                new BrokerTransactionSimulator(webDriver),
                                                                brokerTabNavigator,
                                                                _importProcessor,
                                                                webDriver);
                brokerTableScraper.Scrape(transactionParameter);
            }
            catch (Exception e)
            {
                Logger.Error(e);
                if (e.Message.Contains("Back-office is currently updating"))
                {
                    throw new BackOfficeOfflineException("back office exception detected", e);
                }
            }

            var taskResult = new TaskResult {
                IsSuccessful = true
            };

            taskResult.SetData(webDriver);
            return(taskResult);
        }
Esempio n. 10
0
        /// <summary>
        /// Add parameters to SqlCommand
        /// </summary>
        /// <param name="cmd"></param>
        /// <param name="attrName"></param>
        /// <param name="value"></param>
        /// <param name="dbType"></param>
        public IRepository AddInnerParameter(ISqlCommand cmd, string attrName, object value, DbType?dbType = null)
        {
            if (attrName != null && attrName[0] != '@')
            {
                attrName = "@" + attrName;
            }

            if (value?.GetType().GetTypeInfo().IsEnum ?? false)
            {
                value = value.ConvertValue <long>();
            }

            var sqlDbTypeValue = value ?? DBNull.Value;

            var param = new TransactionParameter(DataBaseTypes, attrName, sqlDbTypeValue, dbType);

            cmd.Command.Parameters.Add(param.Parameter);
            return(this);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="transactionParameter"></param>
        /// <returns></returns>
        public TaskResult Do(TransactionParameter transactionParameter)
        {
            switch (transactionParameter.Mode)
            {
            case ImportMode.Batch:
                _batchActor.Do(transactionParameter);
                break;

            case ImportMode.Retry:
                break;

            case ImportMode.Single:
                _singleActor.Do(transactionParameter);
                break;

            case ImportMode.Recovery:
                _recoveryActor.Do(transactionParameter);
                break;
            }
            return(new TaskResult());
        }
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public TaskResult Scrape(TransactionParameter transactionParameter)
        {
            var counter = 0;

            foreach (var import in _imports)
            {
                counter++;
                Logger.Info($"processing {counter} out of {_imports.Count}");
                LogicalThreadContext.Properties["symbol"] = import.Symbol;
                var importTracker = new ImportTracker(import.Symbol, transactionParameter.FromDate);

                try
                {
                    //create new transaction parameter to avoid threading issues
                    var parameter = new TransactionParameter
                    {
                        Symbol   = import.Symbol,
                        FromDate = transactionParameter.FromDate,
                        ToDate   = transactionParameter.ToDate
                    };
                    _brokerTransactionSimulator.Simulate(parameter);

                    var fluentWait = new DefaultWait <IWebDriver>(_webDriver)
                    {
                        Timeout         = TimeSpan.FromSeconds(30),
                        PollingInterval = TimeSpan.FromMilliseconds(250)
                    };
                    fluentWait.IgnoreExceptionTypes(typeof(NoSuchElementException));
                    var rows = fluentWait
                               .Until(x => x.FindElements(By.XPath("/html/body/form/table/tbody/tr")));

                    if (rows.Count > 0)
                    {
                        Logger.Info("initiating transaction builder");
                        var brokerTransactions = _brokerTransactionBuilder.Build(rows.ToList(), parameter);
                        Logger.Info("initiating transaction process");
                        _brokerTransactionProcessor.Process(brokerTransactions);
                        _brokerTransactionBuilder.Transactions.Clear();

                        importTracker.Status = "Success";
                        Logger.Info($"broker transactions for completed for symbol: {import.Symbol}");
                    }
                    importTracker.Status = "None";
                }
                catch (Exception e)
                {
                    Logger.Warn($"An issue trying to download broker transactions found, adding to retry queue for later processing", e);
                    importTracker.Status = "Retry";
                }

                //switch back to main frame to prevent
                _brokerTabNavigator.NavigateHeaderFrame();
                _brokerTabNavigator.Navigate(true);
                _importProcessor.AddTracker(importTracker);
            }

            Logger.Info($"broker table scraping completed.");
            return(new TaskResult {
                IsSuccessful = true
            });
        }
        public ActionResult Save(LotCreateDetailViewModel model)
        {
            MethodReturnResult result = new MethodReturnResult();

            try
            {
                if (ModelState.IsValid)
                {
                    CreateParameter p = new CreateParameter()
                    {
                        Creator             = User.Identity.Name,
                        LineStoreName       = model.LineStoreName,
                        LotType             = model.LotType,
                        OperateComputer     = Request.UserHostAddress,
                        Operator            = User.Identity.Name,
                        OrderNumber         = model.OrderNumber,
                        Quantity            = model.Quantity,
                        RawMaterialCode     = model.MaterialCode,
                        RawMaterialLot      = model.MaterialLot,
                        RawQuantity         = model.RawQuantity,
                        Remark              = model.Description,
                        RouteEnterpriseName = model.RouteEnterpriseName,
                        RouteName           = model.RouteName,
                        RouteStepName       = model.RouteStepName,
                        LineCode            = model.LineCode,
                        LotNumbers          = new List <string>()
                    };

                    char splitChar = ',';
                    //获取批次号值。
                    string[] lotNumbers = Request["LotNumber"].ToUpper().Split(splitChar);
                    p.LotNumbers = lotNumbers.ToList();

                    //获取自定义属性值。
                    IList <BaseAttribute> lstAttribute = new List <BaseAttribute>();
                    using (BaseAttributeServiceClient client = new BaseAttributeServiceClient())
                    {
                        PagingConfig cfg = new PagingConfig()
                        {
                            IsPaging = false,
                            Where    = string.Format("Key.CategoryName='{0}'", "LotCreateAttribute")
                        };

                        MethodReturnResult <IList <BaseAttribute> > rst = client.Get(ref cfg);
                        if (rst.Code <= 0 && rst.Data != null && rst.Data.Count > 0)
                        {
                            lstAttribute = rst.Data;
                        }
                    }
                    p.Attributes = new Dictionary <string, IList <TransactionParameter> >();
                    foreach (BaseAttribute attr in lstAttribute)
                    {
                        string vals = Request["ATTR_" + attr.Key.AttributeName];
                        if (string.IsNullOrEmpty(vals))
                        {
                            continue;
                        }

                        string[] attrValues = vals.Split(splitChar);
                        for (int i = 0; i < p.LotNumbers.Count && i < attrValues.Length; i++)
                        {
                            string lotNumber = p.LotNumbers[i];
                            string tpVal     = attrValues[i];
                            //如果没有设置值,则不进行数据存储。
                            if (string.IsNullOrEmpty(tpVal))
                            {
                                continue;
                            }
                            if (!p.Attributes.ContainsKey(lotNumber))
                            {
                                p.Attributes.Add(lotNumber, new List <TransactionParameter>());
                            }
                            if (attr.DataType == EnumDataType.Boolean)
                            {
                                tpVal = tpVal == "on" ? "true" : "false";
                            }
                            TransactionParameter tp = new TransactionParameter()
                            {
                                Index = attr.Order,
                                Name  = attr.Key.AttributeName,
                                Value = tpVal
                            };
                            p.Attributes[lotNumber].Add(tp);
                        }
                    }
                    //创建批次。
                    using (LotCreateServiceClient client = new LotCreateServiceClient())
                    {
                        result = client.Create(p);
                    }
                    //标签打印。
                    if (result.Code == 0)
                    {
                        result = PrintPrivate(model);
                    }

                    if (result.Code == 0)
                    {
                        result.Message = "保存成功。";
                    }
                }
            }
            catch (Exception ex)
            {
                result.Code    = 1000;
                result.Message = ex.Message;
                result.Detail  = ex.ToString();
            }
            // 如果我们进行到这一步时某个地方出错,则重新显示表单
            return(Json(result));
        }
Esempio n. 14
0
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public TaskResult Do(TransactionParameter transactionParameter)
        {
            var isBackOfficeException = false;
            var sleepInterval         = 5;

            _importProcessor.PurgeTrackers(transactionParameter);
            while (true)
            {
                if (isBackOfficeException)
                {
                    Logger.Info($"Performing sleep for {sleepInterval} minutes");
                    Thread.Sleep(TimeSpan.FromMinutes(sleepInterval));
                    sleepInterval *= 2;
                    Logger.Info("awoken from sleep");
                }

                var workerCount = (!string.IsNullOrEmpty(transactionParameter.Symbol))
                    ? 1 : Convert.ToInt32(_configuration["WorkerCount"]);
                Logger.Info($"setting worker count {workerCount}");

                var webDrivers = new List <IWebDriver>();
                var tasks      = new List <Task>();
                var cancellationTokenSource = new CancellationTokenSource();
                var cancellationToken       = cancellationTokenSource.Token;
                for (var index = 0; index <= workerCount; index++)
                {
                    var batch = (!string.IsNullOrEmpty(transactionParameter.Symbol))
                        ? new List <Import> {
                        new Import {
                            Symbol = transactionParameter.Symbol
                        }
                    }
                        : _batchProcessor
                    .Process()
                    .GetData <List <Import> >();
                    if (batch.Count == 0)
                    {
                        continue;
                    }
                    if (index > 0)
                    {
                        Logger.Info($"sleeping for 30 seconds to allow breathing for previously logged sessions");
                        Thread.Sleep(TimeSpan.FromSeconds(30));
                    }

                    var webDriver = WebDriverFactory.Create(_configuration);
                    var task      = Task
                                    .Factory
                                    .StartNew(() => _brokerTransactionScraper.Scrape(transactionParameter, batch, webDriver), cancellationToken);
                    var symbols = string.Join(",", batch.Select(b => b.Symbol));
                    webDrivers.Add(webDriver);
                    Logger.Info($"Thread id: {task.Id} will processing the following symbols: {symbols}");
                    LogicalThreadContext.Properties["thread-id"] = task.Id;
                    tasks.Add(task);
                }

                Logger.Info($"waiting for all complete, thread count: {tasks.Count}");
                isBackOfficeException = _taskProcessor
                                        .Process(tasks, cancellationTokenSource)
                                        .IsSuccessful.Value;

                Logger.Info("performing webdriver cleanup");
                foreach (var webDriver in webDrivers)
                {
                    webDriver.Quit();
                    webDriver.Dispose();
                }

                Logger.Info("performing task cleanup");
                foreach (var task in tasks)
                {
                    task.Dispose();
                }

                if (transactionParameter.Frequency.Equals("daily", StringComparison.CurrentCultureIgnoreCase))
                {
                    break;
                }
                var isCompleted = _importProcessor.IsCompleted();
                if (isCompleted)
                {
                    break;
                }
            }

            return(new TaskResult {
                IsSuccessful = true
            });
        }
Esempio n. 15
0
        public bool stepOut(LotReaderDeviceElement lotinfo, Lot lot, LotReaderFinishedArgs Args, TrackOutParameter p)
        {
            bool flag = true;
            //出站
            MethodReturnResult result = null;

            using (WipEngineerServiceClient client = new WipEngineerServiceClient())
            {
                if (lot.StateFlag == EnumLotState.WaitTrackOut)
                {
                    IDictionary <string, IList <TransactionParameter> > dicParams = new Dictionary <string, IList <TransactionParameter> >();
                    //获取工序参数列表。
                    IList <RouteStepParameter> lstRouteStepParameter = GetParameterList(lot.RouteName, lot.RouteStepName, EnumLotState.WaitTrackOut);

                    if (lstRouteStepParameter != null)
                    {
                        #region 组织批次附加代码
                        foreach (RouteStepParameter item in lstRouteStepParameter)
                        {
                            if (!dicParams.ContainsKey(lot.Key))
                            {
                                dicParams.Add(lot.Key, new List <TransactionParameter>());
                            }
                            string val = null;
                            if (item.Key.ParameterName == "电池片批号" || item.Key.ParameterName == "电池片小包装号")
                            {
                                val = GetCellLotList(item.MaterialType, lot.LineCode, lot.RouteStepName, lot.OrderNumber, p.EquipmentCode);
                            }
                            else
                            {
                                val = GetParameterLotList(item.MaterialType, lot.LineCode, lot.RouteStepName, lot.OrderNumber, p.EquipmentCode);
                            }
                            TransactionParameter tp = new TransactionParameter()
                            {
                                Index = item.ParamIndex,
                                Name  = item.Key.ParameterName,
                                Value = val
                            };
                            dicParams[lot.Key].Add(tp);
                        }

                        p.Paramters = dicParams;
                        #endregion
                    }

                    MethodReturnResult resultTrackOut = client.TrackOutLot(p);
                    if (resultTrackOut.Code == 0)
                    {
                        Args.TransferMsg = string.Format("批次:{0} {1}出站成功", lotinfo.LotNumber, p.RouteOperationName);
                        flag             = true;
                    }
                    else
                    {
                        flag             = false;
                        Args.TransferMsg = string.Format("批次:{0} {1}出站失败 =>  ", lotinfo.LotNumber, p.RouteOperationName) + resultTrackOut.Message;
                    }
                    //存储读头扫码结果信息

                    Args.TransferMsg = Args.TransferMsg + "-------------";
                    if (OnLotReaderFinished != null)
                    {
                        CommonFun.eventInvoket(() => { OnLotReaderFinished(this, Args); });
                    }
                }
            }
            ErrorLog(null, Args.TransferMsg);
            return(flag);
        }
Esempio n. 16
0
        /// <summary>
        /// 批次过站作业。
        /// </summary>
        /// <param name="obj">批次对象。</param>
        /// <param name="model">过站模型对象。</param>
        /// <returns>返回结果。</returns>
        private MethodReturnResult Track(Lot obj, LotTrackViewModel model)
        {
            string             lotNumber = model.LotNumber.ToUpper();
            MethodReturnResult result    = new MethodReturnResult();
            IDictionary <string, IList <TransactionParameter> > dicParams = new Dictionary <string, IList <TransactionParameter> >();
            //获取工序参数列表。
            IList <RouteStepParameter> lstRouteStepParameter = GetParameterList(obj.RouteName, obj.RouteStepName, obj.StateFlag);

            //组织批次附加参数。
            if (lstRouteStepParameter != null)
            {
                foreach (RouteStepParameter item in lstRouteStepParameter)
                {
                    string hashcode = string.Format("{0}{1}{2}", item.Key.RouteName, item.Key.RouteStepName, item.Key.ParameterName)
                                      .GetHashCode()
                                      .ToString()
                                      .Replace('-', '_');
                    string paramName = string.Format("PARAM_{0}", hashcode);
                    string val       = Request.Form[paramName];
                    //记录上一次值。
                    if (item.IsUsePreValue)
                    {
                        if (Request.Cookies.Get(paramName) != null)
                        {
                            Response.SetCookie(new HttpCookie(paramName, val));
                        }
                        else if (!string.IsNullOrEmpty(val))
                        {
                            Response.Cookies.Add(new HttpCookie(paramName, val));
                        }
                    }
                    if (string.IsNullOrEmpty(val))
                    {
                        continue;
                    }
                    if (!dicParams.ContainsKey(obj.Key))
                    {
                        dicParams.Add(obj.Key, new List <TransactionParameter>());
                    }
                    if (item.DataType == EnumDataType.Boolean)
                    {
                        val = val == "on" ? "true" : "false";
                    }



                    TransactionParameter tp = new TransactionParameter()
                    {
                        Index = item.ParamIndex,
                        Name  = item.Key.ParameterName,
                        Value = val
                    };
                    dicParams[obj.Key].Add(tp);
                }
            }
            //批次当前状态为等待进站。
            if (obj.StateFlag == EnumLotState.WaitTrackIn)
            {
                TrackInParameter p = new TrackInParameter()
                {
                    Creator            = User.Identity.Name,
                    EquipmentCode      = model.EquipmentCode,
                    LineCode           = model.LineCode,
                    LotNumbers         = new List <string>(),
                    OperateComputer    = Request.UserHostAddress,
                    Operator           = User.Identity.Name,
                    Paramters          = dicParams,
                    Remark             = model.Description,
                    RouteOperationName = model.RouteOperationName
                };
                p.LotNumbers.Add(lotNumber);
                //进行批次进站。
                using (LotTrackInServiceClient client = new LotTrackInServiceClient())
                {
                    result = client.TrackIn(p);
                    if (result.Code == 0)
                    {
                        if (!string.IsNullOrEmpty(result.Message))
                        {
                            if (!result.Message.EndsWith("\n"))
                            {
                                result.Message += "\n";
                            }
                            result.Message = result.Message.Replace("\n", "<br/>");
                        }
                        result.Message = string.Format("批次 {0} 进站成功。", lotNumber);
                    }
                }
            }
            //批次当前状态为等待出站。
            else if (obj.StateFlag == EnumLotState.WaitTrackOut)
            {
                TrackOutParameter p = new TrackOutParameter()
                {
                    Creator            = User.Identity.Name,
                    LineCode           = model.LineCode,
                    LotNumbers         = new List <string>(),
                    OperateComputer    = Request.UserHostAddress,
                    Operator           = User.Identity.Name,
                    Paramters          = dicParams,
                    Remark             = model.Description,
                    RouteOperationName = model.RouteOperationName,
                    EquipmentCode      = model.EquipmentCode,
                    Color = model.Color,
                    Grade = model.Grade
                };
                p.LotNumbers.Add(lotNumber);
                //进行不良数量记录
                IList <ReasonCodeCategoryDetail> lstDefectReasonCodes = GetDefectReasonCodes(obj.RouteName, obj.RouteStepName);
                p.DefectReasonCodes = new Dictionary <string, IList <DefectReasonCodeParameter> >();
                if (lstDefectReasonCodes != null && lstDefectReasonCodes.Count > 0)
                {
                    foreach (ReasonCodeCategoryDetail item in lstDefectReasonCodes)
                    {
                        string hashcode = string.Format("{0}{1}", item.Key.ReasonCodeCategoryName, item.Key.ReasonCodeName)
                                          .GetHashCode()
                                          .ToString()
                                          .Replace('-', '_');
                        string inputControlName = string.Format("DefectReasonCode_{0}", hashcode);
                        string val  = Request.Form[inputControlName];
                        double dVal = 0;
                        if (string.IsNullOrEmpty(val) ||
                            double.TryParse(val, out dVal) == false ||
                            dVal == 0)
                        {
                            continue;
                        }
                        if (!p.DefectReasonCodes.ContainsKey(obj.Key))
                        {
                            p.DefectReasonCodes.Add(obj.Key, new List <DefectReasonCodeParameter>());
                        }
                        DefectReasonCodeParameter drcp = new DefectReasonCodeParameter()
                        {
                            ReasonCodeCategoryName = item.Key.ReasonCodeCategoryName,
                            ReasonCodeName         = item.Key.ReasonCodeName,
                            Quantity           = dVal,
                            Description        = string.Empty,
                            ResponsiblePerson  = string.Empty,
                            RouteOperationName = string.Empty
                        };
                        p.DefectReasonCodes[obj.Key].Add(drcp);
                    }
                }
                //进行报废数量记录
                IList <ReasonCodeCategoryDetail> lstScrapReasonCodes = GetScrapReasonCodes(obj.RouteName, obj.RouteStepName);
                p.ScrapReasonCodes = new Dictionary <string, IList <ScrapReasonCodeParameter> >();
                if (lstScrapReasonCodes != null && lstScrapReasonCodes.Count > 0)
                {
                    foreach (ReasonCodeCategoryDetail item in lstScrapReasonCodes)
                    {
                        string hashcode = string.Format("{0}{1}", item.Key.ReasonCodeCategoryName, item.Key.ReasonCodeName)
                                          .GetHashCode()
                                          .ToString()
                                          .Replace('-', '_');
                        string inputControlName = string.Format("ScrapReasonCode_{0}", hashcode);
                        string val  = Request.Form[inputControlName];
                        double dVal = 0;
                        if (string.IsNullOrEmpty(val) ||
                            double.TryParse(val, out dVal) == false ||
                            dVal == 0)
                        {
                            continue;
                        }
                        if (!p.ScrapReasonCodes.ContainsKey(obj.Key))
                        {
                            p.ScrapReasonCodes.Add(obj.Key, new List <ScrapReasonCodeParameter>());
                        }
                        ScrapReasonCodeParameter srcp = new ScrapReasonCodeParameter()
                        {
                            ReasonCodeCategoryName = item.Key.ReasonCodeCategoryName,
                            ReasonCodeName         = item.Key.ReasonCodeName,
                            Quantity           = dVal,
                            Description        = string.Empty,
                            ResponsiblePerson  = string.Empty,
                            RouteOperationName = string.Empty
                        };
                        p.ScrapReasonCodes[obj.Key].Add(srcp);
                    }
                }

                //进行批次出站。
                using (LotTrackOutServiceClient client = new LotTrackOutServiceClient())
                {
                    result = client.TrackOut(p);
                    if (result.Code == 0)
                    {
                        if (!string.IsNullOrEmpty(result.Message))
                        {
                            if (!result.Message.EndsWith("\n"))
                            {
                                result.Message += "\n";
                            }
                            result.Message = result.Message.Replace("\n", "<br/>");
                        }
                        result.Message += string.Format("批次 {0} 出站成功。", lotNumber);
                    }
                }
            }
            else
            {
                result.Code    = 100;
                result.Message = string.Format("批次 {0} 状态为({1}),不能进行工作站作业。"
                                               , lotNumber
                                               , obj.StateFlag.GetDisplayName());
            }
            return(result);
        }
 public LoginSimulator(IWebDriver webDriver,
                       TransactionParameter transactionParameter)
 {
     _webDriver            = webDriver;
     _transactionParameter = transactionParameter;
 }