Exemple #1
0
        /// <summary>寫入重發佇列</summary>
        /// <param name="methodName">方法名</param>
        /// <param name="methodArgs">參數</param>
        /// <param name="serverSideMethodName">伺服端方法名稱(客戶端重發用)</param>
        /// <returns>確認碼</returns>
        public string RecordMethodQueue(string methodName, List <object> methodArgs, string serverSideMethodName = "")
        {
            ShelvedMethod sm = null;

            if (MethodQueue.Any(m => m.Name == methodName && !m.MethodArgs.Except(methodArgs).Any()))
            {
                sm        = MethodQueue.First(m => m.Name == methodName && !m.MethodArgs.Except(methodArgs).Any());
                sm.ExecAt = DateTime.Now;
            }
            else
            {
                // 原理 有重發需求的方法應在此記錄,並產生確認碼並隨方法送回伺服器,伺服器收到後會將確認碼(CmdCode)回傳回來 客戶端在重新收到確認碼之後才把對應的 ShelvedMethod 清掉 重發的時機則是在狀態改變為已連線時一次重發
                sm = new ShelvedMethod
                {
                    Name                 = methodName,
                    MethodArgs           = methodArgs,
                    ExecAt               = DateTime.Now,
                    CmdCode              = Guid.NewGuid().ToString(),
                    ServerSideMethodName = serverSideMethodName
                };
                MethodQueue.Add(sm);
            }

            SaveMethodQueueToXML();

            return(sm.CmdCode);
        }
Exemple #2
0
        void TimerTick(object sender, EventArgs e)
        {
            var time = DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToShortTimeString();

            TimeLabel.Text = TimeLabel.Text.Contains(":") ? time.Replace(":", " ") : time;
            MethodQueue.RunQueue();
        }
Exemple #3
0
        /// <summary>重送方法佇列中所有擱置命令</summary>
        public void ResendMethodInQueue()
        {
            List <ShelvedMethod> queue = new List <ShelvedMethod>(MethodQueue); // 未避免待會刪到當前狀態記錄,要 Clone

            MethodQueue.Clear();                                                // 清掉客戶端狀態中的佇列方法,因為觸發時會再寫入。
            SaveMethodQueueToXML();

            queue.ForEach(m => HubProxy.Invoke(m.ServerSideMethodName, m.Name, m.MethodArgs.ToArray()));
        }
Exemple #4
0
        /// <summary>
        /// When we need to jump to a function we use this. If the method hasn't been built yet, it will be after this :)
        /// </summary>
        /// <param name="method"></param>
        /// <returns></returns>
        public UInt256 GetMethodTag(MethodDeclarationSyntax method)
        {
            string methodName = method.Identifier.Text;

            if (MethodBlockEntryPoints.ContainsKey(methodName))
            {
                return(MethodBlockEntryPoints[methodName].Data);
            }

            UInt256 newTag = GetNewTag();

            MethodBlockEntryPoints.Add(methodName, new EthSharpAssemblyItem(AssemblyItemType.Tag, newTag));
            MethodQueue.Enqueue(method);
            return(newTag);
        }
Exemple #5
0
    public ThreadedContourMesh(Action <MeshData[]> _MeshReciever, int _threadCount, bool[,] _map, float _squareSize, bool _drawContours = true, bool _drawSimple = true, bool _uniqueVerticies = true)
    {
        MeshReciever = _MeshReciever;
        threadCount  = _threadCount;
        map          = _map;
        squareSize   = _squareSize;

        GetCellDiv();

        drawContours   = _drawContours;
        drawSimple     = _drawSimple;
        uniqueVertcies = _uniqueVerticies;

        methodQueue = new MethodQueue();
        meshCells   = new MeshData[threadCount];
        cells       = new MapCells[threadCount];

        cellWidth  = map.GetLength(0) / divX;
        cellHeight = map.GetLength(1) / divZ;

        Debug.Log("Map Dimensions: " + map.GetLength(0) + ", " + map.GetLength(1));
        Debug.Log("Threads: " + threadCount);
    }
        private static void HandleEvents()
        {
            EventServiceFactory.EventService.GetEvent <GenericEvent <ActionData> >().Subscribe(x =>
            {
                if (x.Value.Action.ActionType == "UpdateApplicationSubTitle")
                {
                    var title = x.Value.GetAsString("Title");
                    PresentationServices.SubTitle.ApplicationTitle = title;
                    var fontSize = x.Value.GetAsInteger("FontSize");
                    if (fontSize > 0)
                    {
                        PresentationServices.SubTitle.ApplicationTitleFontSize = fontSize;
                    }
                    var fontColor = x.Value.GetAsString("Color");
                    if (!string.IsNullOrEmpty(fontColor))
                    {
                        PresentationServices.SubTitle.ApplicationTitleColor = fontColor;
                    }
                }
                if (x.Value.Action.ActionType == "RemoveLastModifier")
                {
                    var ticket = x.Value.GetDataValue <Ticket>("Ticket");
                    if (ticket == null)
                    {
                        return;
                    }
                    var ti = x.Value.GetDataValue <TicketItem>("TicketItem");
                    if (ti == null)
                    {
                        return;
                    }
                    if (ti.Properties.Count > 0)
                    {
                        var prop = ti.LastSelectedProperty ?? ti.Properties.Last();
                        prop.Quantity--;
                        if (prop.Quantity < 1)
                        {
                            ti.Properties.Remove(prop);
                        }
                    }
                    TicketViewModel.RecalculateTicket(ticket);
                }

                if (x.Value.Action.ActionType == "UpdateTicketItemPriceTag")
                {
                    var ticket = x.Value.GetDataValue <Ticket>("Ticket");
                    if (ticket == null)
                    {
                        return;
                    }

                    var ti = x.Value.GetDataValue <TicketItem>("TicketItem");
                    if (ti == null)
                    {
                        return;
                    }

                    var priceTag = x.Value.GetAsString("PriceTag");
                    var mi       = AppServices.DataAccessService.GetMenuItem(ti.MenuItemId);
                    if (mi == null)
                    {
                        return;
                    }

                    var portion = mi.Portions.SingleOrDefault(y => y.Name == ti.PortionName);
                    if (portion == null)
                    {
                        return;
                    }

                    ti.UpdatePortion(portion, priceTag, null);

                    TicketViewModel.RecalculateTicket(ticket);
                    EventServiceFactory.EventService.PublishEvent(EventTopicNames.RefreshSelectedTicket);
                }

                if (x.Value.Action.ActionType == "UpdateTicketItemTag")
                {
                    var ticket = x.Value.GetDataValue <Ticket>("Ticket");
                    if (ticket == null)
                    {
                        return;
                    }

                    var ti = x.Value.GetDataValue <TicketItem>("TicketItem");
                    if (ti == null)
                    {
                        return;
                    }

                    var tag = x.Value.GetAsString("Tag");
                    ti.Tag  = tag;
                    decimal val;
                    decimal.TryParse(tag, out val);
                }

                if (x.Value.Action.ActionType == "UpdateLastTicketItemPriceTag")
                {
                    var ticket = x.Value.GetDataValue <Ticket>("Ticket");
                    if (ticket == null)
                    {
                        return;
                    }

                    var ti = ticket.TicketItems.LastOrDefault();
                    if (ti == null)
                    {
                        return;
                    }

                    var priceTag = x.Value.GetAsString("PriceTag");
                    var mi       = AppServices.DataAccessService.GetMenuItem(ti.MenuItemId);
                    if (mi == null)
                    {
                        return;
                    }

                    var portion = mi.Portions.SingleOrDefault(y => y.Name == ti.PortionName);
                    if (portion == null)
                    {
                        return;
                    }

                    ti.UpdatePortion(portion, priceTag, null);

                    TicketViewModel.RecalculateTicket(ticket);
                    EventServiceFactory.EventService.PublishEvent(EventTopicNames.RefreshSelectedTicket);
                }

                if (x.Value.Action.ActionType == "GiftLastTicketItem")
                {
                    var ticket = x.Value.GetDataValue <Ticket>("Ticket");
                    if (ticket != null)
                    {
                        var ti = ticket.TicketItems.LastOrDefault();
                        if (ti != null)
                        {
                            decimal quantity;
                            decimal.TryParse(x.Value.Action.GetParameter("Quantity"), out quantity);
                            if (quantity > 0 && ti.Quantity > quantity)
                            {
                                ti.UpdateSelectedQuantity(quantity);
                                ti = ticket.ExtractSelectedTicketItems(new List <TicketItem> {
                                    ti
                                }).FirstOrDefault();
                                if (ti == null)
                                {
                                    return;
                                }
                                AppServices.MainDataContext.AddItemToSelectedTicket(ti);
                            }
                            var reasonId   = 0;
                            var giftReason = x.Value.Action.GetParameter("GiftReason");
                            if (!string.IsNullOrEmpty(giftReason))
                            {
                                var reason = Dao.SingleWithCache <Reason>(u => u.Name == giftReason);
                                if (reason != null)
                                {
                                    reasonId = reason.Id;
                                }
                            }
                            ticket.GiftItem(ti, reasonId, AppServices.CurrentLoggedInUser.Id);
                            TicketViewModel.RecalculateTicket(ticket);
                            EventServiceFactory.EventService.PublishEvent(EventTopicNames.RefreshSelectedTicket);
                        }
                    }
                }

                if (x.Value.Action.ActionType == "UpdateTicketAccount")
                {
                    Expression <Func <Customer, bool> > qFilter = null;

                    var phoneNumber = x.Value.GetAsString("AccountPhone");
                    var accountName = x.Value.GetAsString("AccountName");
                    var note        = x.Value.GetAsString("Note");

                    if (!string.IsNullOrEmpty(phoneNumber))
                    {
                        qFilter = y => y.PhoneNumber == phoneNumber;
                    }

                    if (!string.IsNullOrEmpty(accountName))
                    {
                        if (qFilter == null)
                        {
                            qFilter = y => y.Name == accountName;
                        }
                        else
                        {
                            qFilter = qFilter.And(y => y.Name == accountName);
                        }
                    }

                    if (!string.IsNullOrEmpty(note))
                    {
                        if (qFilter == null)
                        {
                            qFilter = y => y.Note == note;
                        }
                        else
                        {
                            qFilter = qFilter.And(y => y.Note == note);
                        }
                    }

                    if (qFilter != null)
                    {
                        var customer = Dao.Query(qFilter).FirstOrDefault();
                        if (customer != null)
                        {
                            AppServices.MainDataContext.AssignCustomerToSelectedTicket(customer);
                        }
                    }
                    else
                    {
                        AppServices.MainDataContext.AssignCustomerToSelectedTicket(Customer.Null);
                    }
                }

                if (x.Value.Action.ActionType == "UpdateProgramSetting")
                {
                    SettingAccessor.ResetCache();

                    var settingName = x.Value.GetAsString("SettingName");
                    var updateType  = x.Value.GetAsString("UpdateType");
                    if (!string.IsNullOrEmpty(settingName))
                    {
                        var isLocal = x.Value.GetAsBoolean("IsLocal");
                        var setting = isLocal
                            ? AppServices.SettingService.ReadLocalSetting(settingName)
                            : AppServices.SettingService.ReadGlobalSetting(settingName);

                        if (updateType == Resources.Increase)
                        {
                            var settingValue = x.Value.GetAsInteger("SettingValue");
                            if (string.IsNullOrEmpty(setting.StringValue))
                            {
                                setting.IntegerValue = settingValue;
                            }
                            else
                            {
                                setting.IntegerValue = setting.IntegerValue + settingValue;
                            }
                        }
                        else if (updateType == Resources.Decrease)
                        {
                            var settingValue = x.Value.GetAsInteger("SettingValue");
                            if (string.IsNullOrEmpty(setting.StringValue))
                            {
                                setting.IntegerValue = settingValue;
                            }
                            else
                            {
                                setting.IntegerValue = setting.IntegerValue - settingValue;
                            }
                        }
                        else if (updateType == "Multiply")
                        {
                            if (string.IsNullOrEmpty(setting.StringValue))
                            {
                                setting.DecimalValue = 0;
                            }
                            else
                            {
                                setting.DecimalValue = setting.DecimalValue * x.Value.GetAsDecimal("SettingValue");
                            }
                        }
                        else if (updateType == "Toggle")
                        {
                            var settingValue = x.Value.GetAsString("SettingValue");
                            var parts        = settingValue.Split(',');
                            if (string.IsNullOrEmpty(setting.StringValue))
                            {
                                setting.StringValue = parts[0];
                            }
                            else
                            {
                                for (var i = 0; i < parts.Length; i++)
                                {
                                    if (parts[i] == setting.StringValue)
                                    {
                                        setting.StringValue = (i + 1) < parts.Length ? parts[i + 1] : parts[0];
                                        break;
                                    }
                                }
                            }
                        }
                        else
                        {
                            var settingValue    = x.Value.GetAsString("SettingValue");
                            setting.StringValue = settingValue;
                        }
                        if (!isLocal)
                        {
                            AppServices.SettingService.SaveChanges();
                        }
                    }
                }

                if (x.Value.Action.ActionType == "RefreshCache")
                {
                    MethodQueue.Queue("ResetCache", ResetCache);
                }

                if (x.Value.Action.ActionType == "SendMessage")
                {
                    AppServices.MessagingService.SendMessage("ActionMessage", x.Value.GetAsString("Command"));
                }

                if (x.Value.Action.ActionType == "SendEmail")
                {
                    EMailService.SendEMailAsync(x.Value.GetAsString("SMTPServer"),
                                                x.Value.GetAsString("SMTPUser"),
                                                x.Value.GetAsString("SMTPPassword"),
                                                x.Value.GetAsInteger("SMTPPort"),
                                                x.Value.GetAsString("ToEMailAddress"),
                                                x.Value.GetAsString("FromEMailAddress"),
                                                x.Value.GetAsString("Subject"),
                                                x.Value.GetAsString("EMailMessage"),
                                                x.Value.GetAsString("FileName"),
                                                x.Value.GetAsBoolean("DeleteFile"),
                                                x.Value.GetAsBoolean("BypassSslErrors"));
                }

                if (x.Value.Action.ActionType == "ExecuteTicketEvent")
                {
                    var ticket = x.Value.GetDataValue <Ticket>("Ticket");
                    if (ticket != null)
                    {
                        var operationName = x.Value.GetAsString("TicketOperation");
                        if (operationName == Resources.Refresh)
                        {
                            EventServiceFactory.EventService.PublishEvent(EventTopicNames.DisplayTicketView);
                        }
                        if (operationName == Resources.Close)
                        {
                            ticket.PublishEvent(EventTopicNames.PaymentSubmitted);
                        }
                    }
                }


                if (x.Value.Action.ActionType == "UpdateTicketVat")
                {
                    var ticket = x.Value.GetDataValue <Ticket>("Ticket");
                    if (ticket != null)
                    {
                        var vatTemplateName = x.Value.GetAsString("VatTemplate");
                        var vatTemplate     = AppServices.MainDataContext.VatTemplates.FirstOrDefault(y => y.Name == vatTemplateName);
                        if (vatTemplate != null)
                        {
                            ticket.UpdateVat(vatTemplate);
                            TicketViewModel.RecalculateTicket(ticket);
                            EventServiceFactory.EventService.PublishEvent(EventTopicNames.RefreshSelectedTicket);
                        }
                    }
                }

                if (x.Value.Action.ActionType == "UpdateTicketTaxService")
                {
                    var ticket = x.Value.GetDataValue <Ticket>("Ticket");
                    if (ticket != null)
                    {
                        var taxServiceTemplateName = x.Value.GetAsString("TaxServiceTemplate");
                        var taxServiceTemplate     =
                            AppServices.MainDataContext.TaxServiceTemplates.FirstOrDefault(
                                y => y.Name == taxServiceTemplateName);
                        if (taxServiceTemplate != null)
                        {
                            var amount = x.Value.GetAsDecimal("Amount");
                            ticket.AddTaxService(taxServiceTemplate.Id, taxServiceTemplate.CalculationMethod, amount);
                            TicketViewModel.RecalculateTicket(ticket);
                        }
                    }
                }

                if (x.Value.Action.ActionType == "RegenerateTicketVat")
                {
                    var ticket = x.Value.GetDataValue <Ticket>("Ticket");
                    if (ticket != null)
                    {
                        TicketViewModel.RegenerateVatRates(ticket);
                        TicketViewModel.RecalculateTicket(ticket);
                        EventServiceFactory.EventService.PublishEvent(EventTopicNames.RefreshSelectedTicket);
                    }
                }

                if (x.Value.Action.ActionType == "AddTicketDiscount")
                {
                    var ticket = x.Value.GetDataValue <Ticket>("Ticket");
                    if (ticket != null)
                    {
                        var percentValue = x.Value.GetAsDecimal("DiscountPercentage");
                        ticket.AddTicketDiscount(DiscountType.Percent, percentValue, AppServices.CurrentLoggedInUser.Id);
                        TicketViewModel.RecalculateTicket(ticket);
                    }
                }

                if (x.Value.Action.ActionType == "AddTicketItem")
                {
                    var ticket = x.Value.GetDataValue <Ticket>("Ticket");

                    if (ticket != null)
                    {
                        var menuItemName = x.Value.GetAsString("MenuItemName");
                        var menuItem     = AppServices.DataAccessService.GetMenuItemByName(menuItemName);
                        var portionName  = x.Value.GetAsString("PortionName");
                        var quantity     = x.Value.GetAsDecimal("Quantity");
                        var gifted       = x.Value.GetAsBoolean("Gift");
                        var giftReason   = x.Value.GetAsString("GiftReason");
                        var tag          = x.Value.GetAsString("Tag");

                        var departmentId = AppServices.CurrentTerminal.DepartmentId > 0
                               ? AppServices.MainDataContext.SelectedDepartment.Id
                               : ticket.DepartmentId;

                        var ti = ticket.AddTicketItem(AppServices.CurrentLoggedInUser.Id,
                                                      departmentId, menuItem, portionName,
                                                      AppServices.MainDataContext.SelectedDepartment.PriceTag, "");

                        ti.Quantity = quantity;
                        ti.Gifted   = gifted;
                        if (gifted && !string.IsNullOrEmpty(giftReason))
                        {
                            var reason = Dao.SingleWithCache <Reason>(u => u.Name == giftReason);
                            if (reason != null)
                            {
                                ti.ReasonId = reason.Id;
                            }
                        }
                        else
                        {
                            ti.ReasonId = 0;
                        }
                        ti.Tag = tag;

                        TicketViewModel.RecalculateTicket(ticket);
                        EventServiceFactory.EventService.PublishEvent(EventTopicNames.RefreshSelectedTicket);
                    }
                }

                if (x.Value.Action.ActionType == "VoidTicketItems")
                {
                    var ticket = x.Value.GetDataValue <Ticket>("Ticket");
                    if (ticket != null)
                    {
                        var menuItemName = x.Value.GetAsString("MenuItemName");
                        var tag          = x.Value.GetAsString("Tag");
                        if (!string.IsNullOrEmpty(menuItemName) && !string.IsNullOrEmpty(tag))
                        {
                            var lines = ticket.TicketItems.Where(y => !y.Voided &&
                                                                 (string.IsNullOrEmpty(menuItemName) || y.MenuItemName.Contains(menuItemName)) &&
                                                                 (y.Tag.Contains(tag) || string.IsNullOrEmpty(tag))).ToList();
                            lines.ForEach(y => ticket.VoidItem(y, 0, AppServices.CurrentLoggedInUser.Id));
                            TicketViewModel.RecalculateTicket(ticket);
                            EventServiceFactory.EventService.PublishEvent(EventTopicNames.RefreshSelectedTicket);
                        }
                    }
                }

                if (x.Value.Action.ActionType == "UpdateTicketTag")
                {
                    var ticket = x.Value.GetDataValue <Ticket>("Ticket");
                    if (ticket != null)
                    {
                        var tagName  = x.Value.GetAsString("TagName");
                        var tagValue = x.Value.GetAsString("TagValue");
                        if (tagValue.Contains(","))
                        {
                            var ctag = ticket.GetTagValue(tagName);
                            if (!string.IsNullOrEmpty(ctag))
                            {
                                var nextTag = tagValue.Split(',').SkipWhile(y => y != ctag).Skip(1).FirstOrDefault();
                                if (string.IsNullOrEmpty(nextTag))
                                {
                                    nextTag = tagValue.Split(',')[0];
                                }
                                tagValue = nextTag;
                            }
                        }
                        ticket.SetTagValue(tagName, tagValue);
                        var tagData = new TicketTagData {
                            TagName = tagName, TagValue = tagValue
                        };
                        tagData.PublishEvent(EventTopicNames.TagSelectedForSelectedTicket);
                    }
                }

                if (x.Value.Action.ActionType == "UpdatePriceTag")
                {
                    using (var workspace = WorkspaceFactory.Create())
                    {
                        var priceTag       = x.Value.GetAsString("PriceTag");
                        var departmentName = x.Value.GetAsString("DepartmentName");
                        var department     = workspace.Single <Department>(y => y.Name == departmentName);
                        if (department != null)
                        {
                            department.PriceTag = priceTag;
                            workspace.CommitChanges();
                            MethodQueue.Queue("ResetCache", ResetCache);
                        }
                    }
                }

                if (x.Value.Action.ActionType == "ExecutePrintJob")
                {
                    var ticket        = x.Value.GetDataValue <Ticket>("Ticket");
                    var pjName        = x.Value.GetAsString("PrintJobName");
                    var ticketItemTag = x.Value.GetAsString("TicketItemTag");

                    if (!string.IsNullOrEmpty(pjName))
                    {
                        var j = AppServices.CurrentTerminal.PrintJobs.SingleOrDefault(y => y.Name == pjName);

                        if (j != null)
                        {
                            if (ticket != null)
                            {
                                AppServices.MainDataContext.UpdateTicketNumber(ticket);
                                if (j.LocksTicket)
                                {
                                    ticket.RequestLock();
                                }

                                var clonedTicket = ObjectCloner.Clone(ticket);
                                clonedTicket.CopyPaidItemsCache(ticket);
                                if (!string.IsNullOrEmpty(ticketItemTag))
                                {
                                    clonedTicket.TicketItems =
                                        clonedTicket.TicketItems.Where(y => !string.IsNullOrEmpty(y.Tag) &&
                                                                       y.Tag.ToLower().Contains(ticketItemTag.Trim().ToLower())).ToList();
                                }
                                AppServices.PrintService.ManualPrintTicket(clonedTicket, j);
                            }
                            else
                            {
                                AppServices.PrintService.ExecutePrintJob(j);
                            }
                        }
                    }
                }
            });
        }
Exemple #7
0
 protected override void OnSave(string value)
 {
     LastTrigger = DateTime.Now;
     base.OnSave(value);
     MethodQueue.Queue("UpdateCronObjects", TriggerService.UpdateCronObjects);
 }
 protected override void OnDeleteItem(object obj)
 {
     base.OnDeleteItem(obj);
     MethodQueue.Queue("UpdateCronObjects", TriggerService.UpdateCronObjects);
 }
Exemple #9
0
 public void DisplayPopup(string title, string content, object dataObject, string eventMessage, string headerColor)
 {
     _popupDataViewModel.Add(title, content, dataObject, eventMessage, headerColor);
     PopupWindow.Show();
     MethodQueue.Queue("DisplayPopups", DisplayPopups);
 }
Exemple #10
0
        private static void HandleEvents()
        {
            EventServiceFactory.EventService.GetEvent <GenericEvent <IActionData> >().Subscribe(x =>
            {
                if (x.Value.Action.ActionType == ActionNames.DisplayPaymentScreen)
                {
                    var ticket = x.Value.GetDataValue <Ticket>("Ticket");
                    if (ticket != null)
                    {
                        ticket.PublishEvent(EventTopicNames.MakePayment);
                    }
                }

                if (x.Value.Action.ActionType == ActionNames.LockTicket)
                {
                    var ticket = x.Value.GetDataValue <Ticket>("Ticket");
                    if (ticket != null)
                    {
                        ticket.LockTicket();
                    }
                }

                if (x.Value.Action.ActionType == ActionNames.DisplayTicket)
                {
                    var ticketId = x.Value.GetAsInteger("TicketId");
                    if (ticketId > 0)
                    {
                        ExtensionMethods.PublishIdEvent(ticketId, EventTopicNames.DisplayTicket);
                    }
                }

                if (x.Value.Action.ActionType == ActionNames.CreateTicket)
                {
                    EventServiceFactory.EventService.PublishEvent(EventTopicNames.CreateTicket);
                }

                if (x.Value.Action.ActionType == ActionNames.UnlockTicket)
                {
                    var ticket = x.Value.GetDataValue <Ticket>("Ticket");
                    if (ticket != null)
                    {
                        ticket.Locked = false;
                    }
                    EventServiceFactory.EventService.PublishEvent(EventTopicNames.UnlockTicketRequested);
                }

                if (x.Value.Action.ActionType == ActionNames.CloseActiveTicket)
                {
                    EventServiceFactory.EventService.PublishEvent(EventTopicNames.CloseTicketRequested, true);
                }

                if (x.Value.Action.ActionType == ActionNames.UpdateResourceState)
                {
                    var resourceId     = x.Value.GetDataValueAsInt("ResourceId");
                    var resourceTypeId = x.Value.GetDataValueAsInt("ResourceTypeId");
                    var stateName      = x.Value.GetAsString("ResourceState");
                    var state          = CacheService.GetResourceStateByName(stateName);
                    if (state != null)
                    {
                        if (resourceId > 0 && resourceTypeId > 0)
                        {
                            ResourceService.UpdateResourceState(resourceId, state.Id);
                        }
                        else
                        {
                            var ticket = x.Value.GetDataValue <Ticket>("Ticket");
                            if (ticket != null)
                            {
                                var resourceTypeName = x.Value.GetDataValueAsString("ResourceTypeName");
                                foreach (var ticketResource in ticket.TicketResources)
                                {
                                    var resourceType = CacheService.GetResourceTypeById(ticketResource.ResourceTypeId);
                                    if (string.IsNullOrEmpty(resourceTypeName.Trim()) || resourceType.Name == resourceTypeName)
                                    {
                                        ResourceService.UpdateResourceState(ticketResource.ResourceId, state.Id);
                                    }
                                }
                            }
                        }
                    }
                }

                if (x.Value.Action.ActionType == ActionNames.UpdateTicketAccount)
                {
                    var ticket = x.Value.GetDataValue <Ticket>("Ticket");
                    if (ticket != null)
                    {
                        Expression <Func <Resource, bool> > qFilter = null;

                        var phoneNumber = x.Value.GetAsString("AccountPhone");
                        var accountName = x.Value.GetAsString("AccountName");
                        var note        = x.Value.GetAsString("Note");

                        if (!string.IsNullOrEmpty(phoneNumber))
                        {
                            qFilter = y => y.SearchString == phoneNumber;
                        }

                        if (!string.IsNullOrEmpty(accountName))
                        {
                            if (qFilter == null)
                            {
                                qFilter = y => y.Name == accountName;
                            }
                            else
                            {
                                qFilter = qFilter.And(y => y.Name == accountName);
                            }
                        }

                        if (qFilter != null)
                        {
                            var account = Dao.Query(qFilter).FirstOrDefault();
                            if (account != null)
                            {
                                TicketService.UpdateResource(ticket, account);
                            }
                        }
                        else
                        {
                            TicketService.UpdateResource(ticket, Resource.Null);
                        }
                    }
                }

                if (x.Value.Action.ActionType == ActionNames.UpdateProgramSetting)
                {
                    var settingName = x.Value.GetAsString("SettingName");
                    var updateType  = x.Value.GetAsString("UpdateType");
                    if (!string.IsNullOrEmpty(settingName))
                    {
                        var isLocal = x.Value.GetAsBoolean("IsLocal");
                        var setting = isLocal
                            ? SettingService.ReadLocalSetting(settingName)
                            : SettingService.ReadGlobalSetting(settingName);

                        if (updateType == Resources.Increase)
                        {
                            var settingValue = x.Value.GetAsInteger("SettingValue");
                            if (string.IsNullOrEmpty(setting.StringValue))
                            {
                                setting.IntegerValue = settingValue;
                            }
                            else
                            {
                                setting.IntegerValue = setting.IntegerValue + settingValue;
                            }
                        }
                        else if (updateType == Resources.Decrease)
                        {
                            var settingValue = x.Value.GetAsInteger("SettingValue");
                            if (string.IsNullOrEmpty(setting.StringValue))
                            {
                                setting.IntegerValue = settingValue;
                            }
                            else
                            {
                                setting.IntegerValue = setting.IntegerValue - settingValue;
                            }
                        }
                        else if (updateType == "Toggle")
                        {
                            var settingValue = x.Value.GetAsString("SettingValue");
                            var parts        = settingValue.Split(',');
                            if (string.IsNullOrEmpty(setting.StringValue))
                            {
                                setting.StringValue = parts[0];
                            }
                            else
                            {
                                for (var i = 0; i < parts.Length; i++)
                                {
                                    if (parts[i] == setting.StringValue)
                                    {
                                        setting.StringValue = (i + 1) < parts.Length ? parts[i + 1] : parts[0];
                                        break;
                                    }
                                }
                            }
                        }
                        else
                        {
                            var settingValue    = x.Value.GetAsString("SettingValue");
                            setting.StringValue = settingValue;
                        }
                        if (!isLocal)
                        {
                            SettingService.SaveProgramSettings();
                        }
                    }
                }

                if (x.Value.Action.ActionType == ActionNames.RefreshCache)
                {
                    MethodQueue.Queue("ResetCache", ResetCache);
                }

                if (x.Value.Action.ActionType == ActionNames.SendMessage)
                {
                    AppServices.MessagingService.SendMessage("ActionMessage", x.Value.GetAsString("Command"));
                }

                if (x.Value.Action.ActionType == ActionNames.SendEmail)
                {
                    EMailService.SendEMailAsync(x.Value.GetAsString("SMTPServer"),
                                                x.Value.GetAsString("SMTPUser"),
                                                x.Value.GetAsString("SMTPPassword"),
                                                x.Value.GetAsInteger("SMTPPort"),
                                                x.Value.GetAsString("ToEMailAddress"),
                                                x.Value.GetAsString("CCEmailAddresses"),
                                                x.Value.GetAsString("FromEMailAddress"),
                                                x.Value.GetAsString("Subject"),
                                                x.Value.GetAsString("EMailMessage"),
                                                x.Value.GetAsString("FileName"),
                                                x.Value.GetAsBoolean("DeleteFile"),
                                                x.Value.GetAsBoolean("BypassSslErrors"));
                }

                if (x.Value.Action.ActionType == ActionNames.UpdateTicketTax)
                {
                    var ticket = x.Value.GetDataValue <Ticket>("Ticket");
                    if (ticket != null)
                    {
                        var taxTemplateName = x.Value.GetAsString("TaxTemplate");
                        var taxTemplate     = SettingService.GetTaxTemplateByName(taxTemplateName);
                        if (taxTemplate != null)
                        {
                            ticket.UpdateTax(taxTemplate);
                            TicketService.RecalculateTicket(ticket);
                            EventServiceFactory.EventService.PublishEvent(EventTopicNames.RefreshSelectedTicket);
                        }
                    }
                }

                if (x.Value.Action.ActionType == ActionNames.UpdateTicketCalculation)
                {
                    var ticket = x.Value.GetDataValue <Ticket>("Ticket");
                    if (ticket != null)
                    {
                        var calculationTypeName = x.Value.GetAsString("CalculationType");
                        var calculationType     = SettingService.GetCalculationTypeByName(calculationTypeName);
                        if (calculationType != null)
                        {
                            var amount = x.Value.GetAsDecimal("Amount");
                            ticket.AddCalculation(calculationType, amount);
                            TicketService.RecalculateTicket(ticket);
                        }
                    }
                }

                if (x.Value.Action.ActionType == ActionNames.RegenerateTicketTax)
                {
                    var ticket = x.Value.GetDataValue <Ticket>("Ticket");
                    if (ticket != null)
                    {
                        TicketService.RegenerateTaxRates(ticket);
                        TicketService.RecalculateTicket(ticket);
                        EventServiceFactory.EventService.PublishEvent(EventTopicNames.RefreshSelectedTicket);
                    }
                }

                if (x.Value.Action.ActionType == ActionNames.Addticketdiscount)
                {
                    //var ticket = x.Value.GetDataValue<Ticket>("Ticket");
                    //if (ticket != null)
                    //{
                    //    var percentValue = x.Value.GetAsDecimal("DiscountPercentage");
                    //    ticket.AddTicketDiscount(DiscountType.Percent, percentValue, ApplicationState.CurrentLoggedInUser.Id);
                    //    TicketService.RecalculateTicket(ticket);
                    //}
                }

                if (x.Value.Action.ActionType == ActionNames.Addorder)
                {
                    var ticket = x.Value.GetDataValue <Ticket>("Ticket");

                    if (ticket != null)
                    {
                        var menuItemName = x.Value.GetAsString("MenuItemName");
                        var menuItem     = CacheService.GetMenuItem(y => y.Name == menuItemName);
                        var portionName  = x.Value.GetAsString("PortionName");
                        var quantity     = x.Value.GetAsDecimal("Quantity");
                        var tag          = x.Value.GetAsString("Tag");
                        var order        = TicketService.AddOrder(ticket, menuItem.Id, quantity, portionName, null);
                        if (order != null)
                        {
                            order.Tag = tag;
                        }
                    }
                }

                if (x.Value.Action.ActionType == ActionNames.UpdateTicketTag)
                {
                    var ticket = x.Value.GetDataValue <Ticket>("Ticket");
                    if (ticket != null)
                    {
                        var tagName  = x.Value.GetAsString("TagName");
                        var tagValue = x.Value.GetAsString("TagValue");
                        ticket.SetTagValue(tagName, tagValue);
                        var tagData = new TicketTagData {
                            TagName = tagName, TagValue = tagValue
                        };
                        tagData.PublishEvent(EventTopicNames.TicketTagSelected);
                    }
                }

                if (x.Value.Action.ActionType == ActionNames.TagOrder || x.Value.Action.ActionType == ActionNames.UntagOrder || x.Value.Action.ActionType == ActionNames.RemoveOrderTag)
                {
                    var order = x.Value.GetDataValue <Order>("Order");
                    if (order != null)
                    {
                        var tagName  = x.Value.GetAsString("OrderTagName");
                        var orderTag = CacheService.GetOrderTagGroupByName(tagName);

                        if (orderTag != null)
                        {
                            if (x.Value.Action.ActionType == ActionNames.RemoveOrderTag)
                            {
                                var tags = order.OrderTagValues.Where(y => y.OrderTagGroupId == orderTag.Id);
                                tags.ToList().ForEach(y => order.OrderTagValues.Remove(y));
                                return;
                            }
                            var tagValue      = x.Value.GetAsString("OrderTagValue");
                            var orderTagValue = orderTag.OrderTags.SingleOrDefault(y => y.Name == tagValue);
                            if (orderTagValue != null)
                            {
                                if (x.Value.Action.ActionType == ActionNames.TagOrder)
                                {
                                    order.TagIfNotTagged(orderTag, orderTagValue, ApplicationState.CurrentLoggedInUser.Id);
                                }
                                if (x.Value.Action.ActionType == ActionNames.UntagOrder)
                                {
                                    order.UntagIfTagged(orderTag, orderTagValue);
                                }
                            }
                        }
                    }
                }

                if (x.Value.Action.ActionType == ActionNames.MoveTaggedOrders)
                {
                    var ticket       = x.Value.GetDataValue <Ticket>("Ticket");
                    var orderTagName = x.Value.GetAsString("OrderTagName");
                    if (ticket != null && !string.IsNullOrEmpty(orderTagName))
                    {
                        var orderTagValue = x.Value.GetAsString("OrderTagValue");
                        if (ticket.Orders.Any(y => y.OrderTagValues.Any(z => z.OrderTagGroupName == orderTagName && z.Name == orderTagValue)))
                        {
                            var tid = ticket.Id;
                            EventServiceFactory.EventService.PublishEvent(EventTopicNames.CloseTicketRequested, true);
                            ticket           = TicketService.OpenTicket(tid);
                            var orders       = ticket.Orders.Where(y => y.OrderTagValues.Any(z => z.OrderTagGroupName == orderTagName && z.Name == orderTagValue)).ToArray();
                            var commitResult = TicketService.MoveOrders(ticket, orders, 0);
                            if (string.IsNullOrEmpty(commitResult.ErrorMessage) && commitResult.TicketId > 0)
                            {
                                ExtensionMethods.PublishIdEvent(commitResult.TicketId, EventTopicNames.DisplayTicket);
                            }
                            else
                            {
                                ExtensionMethods.PublishIdEvent(tid, EventTopicNames.DisplayTicket);
                            }
                        }
                    }
                }

                if (x.Value.Action.ActionType == ActionNames.UpdatePriceTag)
                {
                    using (var workspace = WorkspaceFactory.Create())
                    {
                        var priceTag       = x.Value.GetAsString("PriceTag");
                        var departmentName = x.Value.GetAsString("DepartmentName");
                        var department     = workspace.Single <Department>(y => y.Name == departmentName);
                        if (department != null)
                        {
                            department.PriceTag = priceTag;
                            workspace.CommitChanges();
                            MethodQueue.Queue("ResetCache", ResetCache);
                        }
                    }
                }

                if (x.Value.Action.ActionType == ActionNames.ExecutePrintJob)
                {
                    var ticket = x.Value.GetDataValue <Ticket>("Ticket");
                    var pjName = x.Value.GetAsString("PrintJobName");
                    if (!string.IsNullOrEmpty(pjName))
                    {
                        TicketService.UpdateTicketNumber(ticket, ApplicationState.CurrentDepartment.TicketTemplate.TicketNumerator);
                        var j = CacheService.GetPrintJobByName(pjName);

                        if (j != null)
                        {
                            if (ticket != null)
                            {
                                PrinterService.PrintTicket(ticket, j);
                            }
                            else
                            {
                                PrinterService.ExecutePrintJob(j);
                            }
                        }
                    }
                }
            });
        }
Exemple #11
0
 /// <summary>伺服器告知清除命令</summary>
 /// <param name="msg">確認碼</param>
 public void CmdFinished(string cmdCode)
 {
     MethodQueue.RemoveAll(mq => mq.CmdCode == cmdCode);
     SaveMethodQueueToXML();
 }