protected override void Execute(NativeActivityContext context) { _productList = new ConcurrentQueue <Product>(); _failedItems = new ConcurrentQueue <IWBPosInput>(); _exceptionList = new ConcurrentQueue <Exception>(); _items = IWBPosList.Get(context); _viewService = IoC.Instance.Resolve <IViewService>(); _messageBuilder = new StringBuilder(); using (var mgr = IoC.Instance.Resolve <IBaseManager <IWB> >()) { var iwbId = IWBId.Get(context); var iwb = mgr.Get(iwbId); if (iwb.MandantID != null) { _partnerId = iwb.MandantID.Value; } } // падать тут ничего не должно try { ProcessCreateProduct(context); } catch (Exception ex) { _exceptionList.Enqueue(ex); _messageBuilder.AppendLine("Процесс был прерван. " + ExceptionHelper.GetErrorMessage(ex)); } ErrorMessage.Set(context, _messageBuilder.Length > 0 ? _messageBuilder.ToString() : string.Empty); Result.Set(context, _productList.ToList()); FailedIWBPosList.Set(context, _failedItems.ToList()); ExceptionList.Set(context, _exceptionList.ToList()); }
private void ProcessCreateProduct(NativeActivityContext context) { #region . Checks&Ini . if (_items == null || _items.Count == 0) { return; } var iwbId = IWBId.Get(context); var placeCode = PlaceCode.Get(context); var operationCode = OperationCode.Get(context); var isMigration = IsMigration.Get(context) ? 1 : 0; var timeOut = TimeOut.Get(context); var wfUow = BeginTransactionActivity.GetUnitOfWork(context); // получаем менеджер приемки Min min = null; using (var mgr = IoC.Instance.Resolve <IBPProcessManager>()) { if (wfUow != null) { mgr.SetUnitOfWork(wfUow); } var minId = mgr.GetDefaultMIN(iwbId); if (minId.HasValue) { using (var mgrIn = IoC.Instance.Resolve <IBaseManager <Min> >()) { if (wfUow != null) { mgr.SetUnitOfWork(wfUow); } min = mgrIn.Get(minId); } } } // определяем параметры приемки var isMinCpvExist = min != null && min.CustomParamVal != null && min.CustomParamVal.Count != 0; var isNeedControlOver = isMinCpvExist && min.CustomParamVal.Any( i => i.CustomParamCode == MinCpv.MINOverEnableCpvName && i.CPVValue == "1"); var isNeedConfirmOver = isNeedControlOver && min.CustomParamVal.Any( i => i.CustomParamCode == MinCpv.MINOverEnableNeedConfirmCpvName && i.CPVValue == "1"); var isMinLimit = isMinCpvExist && min.CustomParamVal.Any(i => i.VCustomParamParent == MinCpv.MinLimitL2CpvName); var itemsToProcess = new List <IWBPosInput>(); #endregion #region . BatchCode&OverCount . foreach (var item in _items) { var itemKey = item.GetKey(); if (!item.IsSelected || itemKey == null) { _failedItems.Enqueue(item); continue; } item.ManageFlag = null; //Ошибки при распознавании batch-кода if (!item.NotCriticalBatchcodeError && !item.IsBpBatchcodeCompleted) { var message = string.IsNullOrEmpty(item.BatchcodeErrorMessage) ? "Ошибка не определена." : item.BatchcodeErrorMessage; SkipItem(item, message); continue; } if (item.RequiredSKUCount < 1) { SkipItem(item, "Некорректно введено 'Количество по факту'"); continue; } // если пытаемся принять с избытком if (isNeedControlOver) { var count = item.ProductCountSKU + (double)item.RequiredSKUCount; var overCount = count - item.IWBPosCount; if (overCount > 0 && isNeedConfirmOver) { var questionMessage = string.Format( "Позиция '{0}' ед.уч. '{1}'.{4}Фактическое кол-во = '{2}'.{4}Излишек составит '{3}'.{4}Принять излишек?", itemKey, item.SKUNAME, count, overCount, Environment.NewLine); var dr = _viewService.ShowDialog( GetDefaultMessageBoxCaption(iwbId), questionMessage, MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.Yes, 14); if (dr == MessageBoxResult.Yes) { item.ManageFlag += (!string.IsNullOrEmpty(item.ManageFlag) ? "," : string.Empty) + "OVERASK_OK"; } else { var message = string.Format("Пользователь отказался принимать излишек по позиции '{0}'", itemKey, item.SKUNAME); SkipItem(item, message); continue; } } } itemsToProcess.Add(item); } #endregion // группируем по артикулу var groupItems = itemsToProcess.GroupBy(i => i.ArtCode).ToArray(); //обработка сроков годности if (isMinLimit) { var ret = ProccesExpireDate(itemsToProcess, min, groupItems, wfUow, iwbId); if (!ret) { return; } } var ask = new ConcurrentQueue <IWBPosInput>(); while (true) { RunCreateProduct(itemsToProcess, ref ask, timeOut, wfUow, operationCode, iwbId, isMigration, placeCode, isNeedControlOver); if (ask == null || ask.Count <= 0) { break; } itemsToProcess.Clear(); foreach (var item in ask) { var message = string.Format("Принять излишек по позиции '{0}' ед.уч. '{1}' ?", item.GetKey(), item.SKUNAME); var res = _viewService.ShowDialog(GetDefaultMessageBoxCaption(iwbId), message, MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.Yes, 14); if (res != MessageBoxResult.Yes) { SkipItem(item, string.Format("Пользователь отказался принимать излишек по позиции '{0}'", item.GetKey())); continue; } itemsToProcess.Add(item); } while (!ask.IsEmpty) { IWBPosInput someItem; ask.TryDequeue(out someItem); } } }