예제 #1
0
        private bool CanUseTriggerForItems(BPTrigger trigger, object[] items)
        {
            // выражения нет - фильтровать ничего не нужно
            if (string.IsNullOrEmpty(trigger.TriggerExcpression))
            {
                return(true);
            }

            // формируем фильтр
            var filters = new List <string>();
            var filter  = trigger.TriggerExcpression;

            if (!string.IsNullOrEmpty(filter))
            {
                filters.Add(string.Format("({0})", filter));
            }
            filter = GetFilter(items);
            if (!string.IsNullOrEmpty(filter))
            {
                filters.Add(string.Format("({0})", filter));
            }
            filter = string.Join(" AND ", filters.ToArray());

            //var filter = string.Format("({0}) AND ({1})", trigger.TriggerExcpression, GetFilter(items));
            // получаем Manager-a
            var objectType      = items[0].GetType();
            var interfaceType   = typeof(IBaseManager <>).MakeGenericType(objectType);
            var managerInstance = IoC.Instance.Resolve(interfaceType) as IBaseManager;

            if (managerInstance == null)
            {
                throw new DeveloperException("Не найден Manager для сущности '{0}'.", objectType.Name);
            }
            var checkedItems = managerInstance.GetFiltered(filter, GetModeEnum.Partial).ToArray();

            return(checkedItems.Length == items.Length);
        }
        private void CreateBtnMenu(string code, BPTrigger trigger, object bpCode, MenuItemBase miChild = null)
        {
            if (string.IsNullOrEmpty(code))
            {
                throw new ArgumentNullException("code");
            }

            // получаем кнопку
            UIButton btn;

            using (var btnMgr = IoC.Instance.Resolve <IBaseManager <UIButton> >())
                btn = btnMgr.Get(code);

            if (btn == null)
            {
                throw new DeveloperException("Can't find button with code " + code);
            }

            // Eсли кнопка будет добавляться в бар и имеет имеет ребенка и родителя, то - ListMenuItem, если только ребенка, то SubListMenuItem, а если в бар не добавляется, то Command
            // Вот такая "прозрачная" логика, будь она не ладна!
            var res = miChild != null
                ? !string.IsNullOrEmpty(btn.Parent)
                    ? new ListMenuItem()
                    : new SubListMenuItem()
                : new CommandMenuItem {
                Command = ExecuteBPCommand
            };

            // если можем добавит вложенный элемент (вне зависимости от того, что перед нами), то добавляем
            var miList = res as ListMenuItem;

            if (miList != null)
            {
                miList.MenuItems.Add(miChild);
            }

            //заполняем параметры кнопок
            res.Name             = code;
            res.IsDynamicBarItem = true;
            res.IsEnable         = true;
            res.Caption          = btn.Caption;
            res.Hint             = btn.Hint;
            res.GlyphAlignment   = GlyphAlignmentType.Top;
            res.DisplayMode      = DisplayModeType.Default;
            res.Priority         = (int)btn.Order;
            res.CommandParameter = new BusinessProcessCommandParameter(bpCode, trigger, res);

            if (!string.IsNullOrEmpty(btn.Image))
            {
                res.ImageSmall =
                    ResourceHelper.GetImageByName("wmsMLC.DCL.Resources", "ImageResources",
                                                  string.Format("{0}16", btn.Image)) ?? ImageResources.DCLDefault16.GetBitmapImage();
                res.ImageLarge =
                    ResourceHelper.GetImageByName("wmsMLC.DCL.Resources", "ImageResources",
                                                  string.Format("{0}32", btn.Image)) ?? ImageResources.DCLDefault32.GetBitmapImage();
            }
            else
            {
                res.ImageSmall = ImageResources.DCLDefault16.GetBitmapImage();
                res.ImageLarge = ImageResources.DCLDefault32.GetBitmapImage();
            }

            if (!string.IsNullOrEmpty(btn.HotKey))
            {
                var kgc    = new KeyGestureConverter();
                var hotKey = kgc.ConvertFromString(btn.HotKey) as KeyGesture;
                if (hotKey != null)
                {
                    res.HotKey = hotKey;
                }
            }

            // получаем панель. нет - используем стандартную
            var bar = string.IsNullOrEmpty(btn.Panel) ? _processBar : Menu.GetOrCreateBarItem(btn.Panel);

            if (string.IsNullOrEmpty(btn.Parent))
            {
                // если базовой не нашли, добавлем в список
                bar.MenuItems.Add(res);
            }
            else
            {
                MenuItemBase baseItem = null;
                // ищем такую кнопку
                foreach (var menuItem in bar.MenuItems)
                {
                    baseItem = GetMenuItem(menuItem, btn.Parent);
                    if (baseItem == null)
                    {
                        continue;
                    }

                    var listItem = baseItem as ListMenuItem;
                    if (listItem == null)
                    {
                        throw new DeveloperException(
                                  "Ошибка настройки кнопок меню процессов. Невозможно добавить кнопку с кодом {0} в кнопку с кодом {1} - не найден список",
                                  code, btn.Parent);
                    }

                    listItem.MenuItems.Add(res);
                    break;
                }

                if (baseItem == null)
                {
                    CreateBtnMenu(btn.Parent, null, null, res);
                }
            }
        }
        /// <summary>
        /// Метод определяет возможно ли запустить данный триггер для выделенных элементов. Если хотя бы для одного такой возможности нет, то меню блокируется для всех
        /// </summary>
        /// <param name="trigger">запускаемый триггер</param>
        /// <param name="items">проверочная коллекция элементов</param>
        /// <returns>истина - в случае возможности запуска</returns>
        private async Task <bool> CanUseTriggerForItems(BPTrigger trigger, object[] items)
        {
            if (WMSEnvironment.Instance.IsConnected == false)
            {
                return(false);
            }

            //INFO: признак того, что можно запускать без выбранной или новой записи
            //TODO: сделанть enum на действие
            if (trigger.TriggerAction.EqIgnoreCase("FORCE"))
            {
                return(true);
            }

            if (items == null || items.Length == 0)
            {
                return(false);
            }

            // если новый объект, то запрещаем
            var source = Source as IIsNew;

            if (source != null && source.IsNew)
            {
                return(false);
            }

            // если коолекция и стоит признак OnlyOne
            if (trigger.TriggerOnlyByOneItem && items.Length > 1)
            {
                return(false);
            }

            // если есть фильтр по сущности
            if (!string.IsNullOrEmpty(trigger.TriggerEntityFilter))
            {
                try
                {
                    var res = items.Cast <T>().Where(trigger.TriggerEntityFilter);
                    if (items.Count() != res.Count())
                    {
                        return(false);
                    }
                }
                catch (Exception ex)
                {
                    var message = string.Format(
                        "Не удалось применить клиентскую проверку триггера процесса. Процесс '{0}'. Выражение '{1}'.",
                        trigger.ProcessCode, trigger.TriggerEntityFilter);
                    _log.Debug(message, ex);
                    return(false);
                }
            }

            // выражения нет - фильтровать ничего не нужно
            if (string.IsNullOrEmpty(trigger.TriggerExcpression))
            {
                return(EmptyTriggerExpressionAllowExecuteAnyItem);
            }

            // формируем фильтр
            var filter = GetBPCheckFilter(trigger.TriggerExcpression, items);

            // получаем Manager-a
            var objectType    = items[0].GetType();
            var interfaceType = typeof(IBaseManager <>).MakeGenericType(objectType);

            return(await CheckTriggerAsync(items, interfaceType, objectType, filter));
        }