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