private Response onWhereCoworker(WhereCoworkerDTO userQuery)
        {
            Console.WriteLine(userQuery.ToJson(true));

            var tp = new TimePeriodDTO()
            {
                StartTime = DateTimeOffset.Now.Date.Add(TimeSpan.Zero),
                EndTime   = DateTimeOffset.Now.Date.Add(new TimeSpan(23, 59, 59))
            };

            Console.WriteLine("Default: " + tp.StartTime.ToString() + " " + tp.EndTime.ToString());

            // if user hasn't entered any data and time -> set to current date and time
            if (userQuery.TimePeriod == null &&
                (!userQuery.Date.HasValue) &&
                userQuery.DateTimeObject == null &&
                (!userQuery.Time.HasValue))
            {
                userQuery.DateTimeObject = new DateTimeWraper(DateTimeOffset.UtcNow);
            }

            // recognize any possible time and data
            tp = RecognizeDate(userQuery.Date, oldTp: tp);
            tp = RecognizeTime(userQuery, oldTp: tp);
            tp = RecognizeDateTime(userQuery, oldTp: tp);

            // create params for Event Server request
            var whereHolderRequest = new HolderLocationPeriodDTO()
            {
                QueryType        = ((DateTime.UtcNow - tp.StartTime)?.TotalMinutes < 15) ? QueryType.Type.WhereNow : QueryType.Type.Where,
                HolderName       = userQuery.TargetName.Trim().Replace("?", ""),
                HolderMiddlename = userQuery.TargetMiddlename.Trim().Replace("?", ""),
                HolderSurname    = userQuery.TargetLastname.Trim().Replace("?", ""),
                TimePeriod       = ((DateTime.UtcNow - tp.StartTime)?.TotalMinutes < 15)
                                        ? new TimePeriodDTO()
                {
                    StartTime = DateTimeOffset.Now.Date.Add(TimeSpan.Zero), EndTime = DateTimeOffset.Now.Date.Add(new TimeSpan(23, 59, 59))
                }
                                        : tp
            };

            Console.WriteLine(whereHolderRequest.ToJson(true));

            foreach (var eventsListener in GlobalScope.CSEventsListeners)
            {
                eventsListener.PostCommand(new RequestHolderLocation(whereHolderRequest));
            }

            // send response to Dialogflow (Dialogflow automatically resend it to Slack, Telegram, Skype, etc.)
            //return new ResponseWebHookIntent() {
            //	FulfillmentText = $"*Буду искать:* '{whereHolderRequest.HolderName} {whereHolderRequest.HolderMiddlename} {whereHolderRequest.HolderSurname}'\n" +
            //				      $"*c :* {whereHolderRequest.TimePeriod.StartTime.ToString()}\n" +
            //					  $"*по:* {whereHolderRequest.TimePeriod.EndTime.ToString()}"
            //}.ToJson();
            return(200);
        }
        private Response onWhenCoworker(WhenCoworkerDTO userQuery)
        {
            //Console.WriteLine(userQuery.ToJson(true));

            var tp = new TimePeriodDTO()
            {
                StartTime = DateTimeOffset.UtcNow.Date.Add(TimeSpan.Zero),
                EndTime   = DateTimeOffset.UtcNow.Date.Add(new TimeSpan(23, 59, 59))
            };

            // if user hasn't entered any data and time -> set to current date and time
            if (!userQuery.Date.HasValue)
            {
                userQuery.Date = DateTimeOffset.UtcNow;
            }

            // recognize any possible time and data
            tp = RecognizeDate(date: userQuery.Date, oldTp: tp);

            // create params for Event Server request
            var holderRequest = new HolderLocationPeriodDTO()
            {
                QueryType        = QueryType.GetType(userQuery.QueryType),
                HolderName       = userQuery.TargetName.Trim().Replace("?", ""),
                HolderMiddlename = userQuery.TargetMiddlename.Trim().Replace("?", ""),
                HolderSurname    = userQuery.TargetLastname.Trim().Replace("?", ""),
                TimePeriod       = tp,
                IsHolderIn       = userQuery.InOrOut == null ? new bool?() :
                                   userQuery.InOrOut.Trim().Equals("пришла", StringComparison.OrdinalIgnoreCase) ? true : false
            };

            Console.WriteLine(holderRequest.ToJson(true));

            foreach (var eventsListener in GlobalScope.CSEventsListeners)
            {
                eventsListener.PostCommand(new RequestHolderLocation(holderRequest));
            }

            return(200);
        }
Пример #3
0
        private void onServerRequest(object sender, CommandBase command)
        {
            Log.Trace("onServerRequest: " + command?.Command);

            try {
                string cmdType = command.Command;

                if (cmdType == RequestHolderLocation.Name)
                {
                    HolderLocationPeriodDTO holderLocationPeriod = HolderLocationPeriodDTO.FromObject(command.Params);

                    var holderLocationDTO = eventService.GetHolderLocations(holderLocationPeriod).Result;
                    holderLocationDTO.QueryType  = holderLocationPeriod.QueryType;
                    holderLocationDTO.IsHolderIn = holderLocationPeriod.IsHolderIn;

                    var response = new ResponseHolderLocation(holderLocationDTO);
                    comunicator.NotifyAll(response, cancellationToken);
                }
            } catch (Exception e) {
                Log.Warn(e.Message + "\n" + e.StackTrace);
            }
        }
Пример #4
0
        public async Task <HolderLocationDTO> GetHolderLocations(HolderLocationPeriodDTO locationPeriod)
        {
            DateTime startTime = locationPeriod.TimePeriod.StartTime.Value.LocalDateTime;
            DateTime endTime   = locationPeriod.TimePeriod.EndTime.Value.LocalDateTime;

            Log.Trace("from: " + startTime.ToString() + "    to: " + endTime.ToString());

            var query = from ev in unitOfWork.Events55.GetAll(true)
                        join startZone55 in unitOfWork.Zones55.GetAll(true) on ev.StartZoneID equals startZone55.colID into startZone55_temp
                        join targetZone55 in unitOfWork.Zones55.GetAll(true) on ev.StartZoneID equals targetZone55.colID into targetZone55_temp
                        join controlPoint in unitOfWork.ControlPoints.GetAll(true) on ev.ControlPointID equals controlPoint.colID into controlPoint_temp
                        join holder in
                        (from eml in unitOfWork.Employees.GetAll(true) select new {
                Id = eml.colID, Surname = eml.colSurname, Name = eml.colName, Middlename = eml.colMiddlename,
                StateCode = "", DepartmentID = eml.colDepartmentID, Department = eml.colDepartment,
                TabNumber = eml.colTabNumber, Photo = eml.colPhoto, HolderType = "Employe"
            }).Concat
                            (from vis in unitOfWork.Visitors.GetAll(true) select new {
                Id        = vis.colID, Surname = vis.colSurname, Name = vis.colName, Middlename = vis.colMiddlename,
                StateCode = "", DepartmentID = (int?)null, Department = "",
                TabNumber = "", Photo = vis.colPhoto, HolderType = "Visitor"
            }
                            )
                        on ev.HolderID equals holder.Id into holder_temp

                        from startZone55 in startZone55_temp.DefaultIfEmpty()
                        from targetZone55 in targetZone55_temp.DefaultIfEmpty()
                        from controlPoint in controlPoint_temp.DefaultIfEmpty()
                        from holder in holder_temp.DefaultIfEmpty()

                        where   ((
                                     holder.Name.ToLower().Contains(locationPeriod.HolderName.ToLower()) &&
                                     holder.Middlename.ToLower().Contains(locationPeriod.HolderMiddlename.ToLower()) &&
                                     holder.Surname.ToLower().Contains(locationPeriod.HolderSurname.ToLower())
                                     ) ||
                                 (
                                     holder.Name.ToLower().Contains(locationPeriod.HolderName.ToLower()) &&
                                     holder.Surname.ToLower().Contains(locationPeriod.HolderSurname.ToLower())
                                 )) &&
                        ev.EventTime >= startTime &&
                        ev.EventTime <= endTime

                        orderby ev.EventTime descending

                        select new {
                Event55      = ev,
                StartZone    = startZone55,
                TargetZone   = targetZone55,
                ControlPoint = controlPoint,
                Holder       = holder
            };

            var holderEvents = await query.Take(2000).ToListAsync(cancellationToken);

            // create and fill events information
            var eventsInfos = new List <EventInfoDTO>();

            foreach (var eventInfo in holderEvents)
            {
                eventsInfos.Add(new EventInfoDTO()
                {
                    Direction = eventInfo?.Event55?.Direction,
                    EventCode = eventInfo?.Event55?.EventCode,
                    EventTime = eventInfo?.Event55?.EventTime.ToUniversalTime(),

                    StartAreaName  = eventInfo?.StartZone?.colName,
                    TargetAreaName = eventInfo?.TargetZone?.colName,

                    ObjectType = eventInfo?.ControlPoint?.colType,
                    ObjectName = eventInfo?.ControlPoint?.colName
                });
            }

            return(new HolderLocationDTO()
            {
                TimePeriod = locationPeriod.TimePeriod,
                EventsInfo = eventsInfos,
                HolderInfo = (holderEvents?.Count == 0)                 // fill Info only about holder. Other fields is null
                                                                ? new EventDTO()
                                                                : new EventDTO()
                {
                    CardNumber = holderEvents[0]?.Event55?.CardNumber,
                    HolderType = holderEvents[0]?.Holder?.HolderType,
                    HolderName = holderEvents[0]?.Holder?.Name,
                    HolderMiddlename = holderEvents[0]?.Holder?.Middlename,
                    HolderSurname = holderEvents[0]?.Holder?.Surname,
                    HolderDepartment = holderEvents[0]?.Holder?.Department,
                    HolderTabNumber = holderEvents[0]?.Holder?.TabNumber,
                    HolderPhoto = holderEvents[0]?.Holder?.Photo
                }
            });
        }
        private async Task processResult(string message)
        {
            if (CS_EventsNotifierSlackBot.Global.GlobalScope.CSEventsListeners.Count > 1)
            {
                return;
            }

            await Task.Delay(1000);

            try {
                Console.WriteLine("Emulator received: " + message);

                CommandBase command = CommandBase.FromJson(message);

                string cmdType = command.Command;

                if (cmdType == RequestHolderLocation.Name)
                {
                    HolderLocationPeriodDTO locationPeriod = HolderLocationPeriodDTO.FromObject(command.Params);

                    string keyToFindLast = locationPeriod.HolderName.Trim().ToLower()
                                           + locationPeriod.HolderMiddlename.Trim().ToLower()
                                           + locationPeriod.HolderSurname.Trim().ToLower()
                                           + locationPeriod.TimePeriod.EndTime?.Date;

                    List <EventInfoDTO> eventsInfo;
                    if (lastGeneratedEvents.ContainsKey(keyToFindLast))
                    {
                        lastGeneratedEvents.TryGetValue(keyToFindLast, out eventsInfo);
                        eventsInfo = eventsInfo.Where(ev => ev.EventTime >= locationPeriod.TimePeriod.StartTime && ev.EventTime <= locationPeriod.TimePeriod.EndTime).ToList();
                    }
                    else
                    {
                        eventsInfo = generateEvents(locationPeriod.TimePeriod);
                        lastGeneratedEvents.Add(keyToFindLast, eventsInfo);
                    }


                    // Emulatig Response from Database
                    var holderLocationDTO = new HolderLocationDTO()
                    {
                        QueryType  = locationPeriod.QueryType,
                        IsHolderIn = locationPeriod.IsHolderIn,
                        TimePeriod = locationPeriod.TimePeriod,
                        HolderInfo = new EventDTO()
                        {
                            CardNumber       = 421449585,
                            HolderType       = "\u041F\u043E\u0441\u0435\u0442\u0438\u0442\u0435\u043B\u044C",                       //Посетитель
                            HolderName       = locationPeriod.HolderName,
                            HolderMiddlename = locationPeriod.HolderMiddlename,
                            HolderSurname    = locationPeriod.HolderSurname,
                            HolderDepartment = "\u041E\u0442\u0434\u0435\u043B \u043A\u0430\u0434\u0440\u043E\u0432", //Отдел кадров
                            HolderTabNumber  = "\u0422\u0430\u0431\u0435\u043B\u044C 845"                             //Табель 845
                        },
                        EventsInfo = eventsInfo
                    };

                    var response = new ResponseHolderLocation(holderLocationDTO);

                    byte[] buffer = Encoding.UTF8.GetBytes(response.ToJson());
                    await webSocket.SendAsync(new ArraySegment <byte>(buffer), WebSocketMessageType.Text, true, token);
                }
            } catch (Exception e) {
                Console.WriteLine(e.ToString());
            }
        }