Exemple #1
0
 protected override void Free(bool disposing)
 {
     // Messenger.Unregister(this);
     //释放所有ExamItem资源
     //
     if (ExamItems != null)
     {
         var allItems = ExamItems.ToArray();
         foreach (var examItem in allItems)
         {
             try
             {
                 examItem.Dispose();
             }
             catch (Exception exp)
             {
                 Logger.ErrorFormat("释放考试项目 {0}-{1} 资源发生异常,原因:{2}", examItem.Name, examItem.ItemCode, exp, exp);
             }
         }
         lock (ExamItems)
         {
             ExamItems.Clear();
         }
         //try
         //{
         //    ProviderFactory.BeforeLoadSimulationLight();
         //}
         //catch (Exception ex)
         //{
         //    Logger.ErrorFormat("异步提前加载灯光出错:{0}", ex.Message);
         //}
     }
 }
Exemple #2
0
        protected virtual void OnExamItemStateChanged(ExamItemStateChangedMessage message)
        {
            if (message.ExamItem == null)
            {
                return;
            }

            var examItems = ExamItems.ToArray();
            var itemState = Context.ExamItemStates.FirstOrDefault(x => x.ItemCode == message.ExamItem.ItemCode);

            if (itemState != null)
            {
                if (message.NewState == ExamItemState.Progressing)
                {
                    itemState.Result = ExamItemResult.None;
                }
                itemState.State = message.NewState;
            }
            //KeiWEI
            if (message.NewState == ExamItemState.Finished)
            {
                if (itemState != null)
                {
                    var rules = Context.Rules.Where(x => x.ExamItemCode == itemState.ItemCode).ToArray();
                    if (rules.Length == 0)
                    {
                        itemState.Result = ExamItemResult.Perfect;
                    }
                    else if (rules.Any(x => x.Required))
                    {
                        itemState.Result = ExamItemResult.Failed;
                    }
                    else
                    {
                        itemState.Result = ExamItemResult.Passed;
                    }
                }

                if (examItems.Contains(message.ExamItem))
                {
                    try
                    {
                        lock (ExamItems)
                        {
                            ExamItems.Remove(message.ExamItem);
                        }
                        message.ExamItem.Dispose();
                    }
                    catch (Exception exp)
                    {
                        Logger.ErrorFormat("释放考试项目下{0}发生异常,原因:{1}", message.ExamItem.ItemCode, exp, exp);
                    }
                }
                else
                {
                    Logger.WarnFormat("ExamMananger中不存在考试项目{0}", message.ExamItem);
                }
            }
        }
Exemple #3
0
 private void OnExamItemEnd(ExamItemEndMessage message)
 {
     if (ExamItems != null)
     {
         var items = ExamItems.Where(x => x.ItemCode == message.ExamItemCode).ToArray();
         foreach (var examItem in items)
         {
             examItem.StopAsync();
         }
     }
 }
Exemple #4
0
        public async Task <IExamItem> StartItemAsync(ExamItemExecutionContext context, CancellationToken token, string ItemVoice = "", string ItemEndVoice = "")
        {
            try
            {
                //todo:如果
                var examItem =
                    ExamItems.FirstOrDefault(x => x.ItemCode == context.ItemCode && x.State == ExamItemState.Progressing);
                if (examItem != null)
                {
                    if (!string.IsNullOrEmpty(ItemVoice))
                    {
                        examItem.VoiceFile = ItemVoice;
                    }
                    if (!string.IsNullOrEmpty(ItemEndVoice))
                    {
                        examItem.EndVoiceFile = ItemEndVoice;
                    }
                    return(examItem);
                }
                examItem = ProviderFactory.CreateExamItem(context.ItemCode, ItemVoice, ItemEndVoice);
                if (examItem != null)
                {
                    if (!string.IsNullOrEmpty(ItemVoice))
                    {
                        examItem.VoiceFile = ItemVoice;
                    }
                    if (!string.IsNullOrEmpty(ItemEndVoice))
                    {
                        examItem.EndVoiceFile = ItemEndVoice;
                    }
                }
                lock (ExamItems)
                {
                    ExamItems.Add(examItem);
                }
                await examItem.StartAsync(context, token).ContinueWith((task) =>
                {
                    if (task.Exception != null)
                    {
                        Logger.ErrorFormat("运行考试项目{0}发生异常,原因:{1}", context.ItemCode, task.Exception, task.Exception);
                    }
                }, token);

                return(examItem);
            }
            catch (Exception exp)
            {
                Logger.ErrorFormat("创建考试项目{0}发生异常,原因:{1}", context.ItemCode, exp, exp);
                return(null);
            }
        }
Exemple #5
0
        private void ExecuteExamItems(CarSignalInfo signalInfo)
        {
            var activedItems = ExamItems.Where(x => x.State == ExamItemState.Progressing).ToArray();

            foreach (var examItem in activedItems.OrderBy(x => x.Order))
            {
                try
                {
                    examItem.Execute(signalInfo);
                }
                catch (Exception exp)
                {
                    Logger.ErrorFormat("接收到信号后执行考试项目{0}发生异常,原因:{1}", examItem.ItemCode, exp, exp);
                }
            }
        }
Exemple #6
0
        /// <summary>
        /// 停止考试
        /// </summary>
        private void StopExam(bool close = false)
        {
            //停止语音播报;
            //TODO:这个需要 持续观察下 敖兄说的有时候报有时候不报这个问题
            //打Error日志只是为了方便客户在不开启日志的情况下也可以
            // Logger.Error("Stop Exam");
            ExamScore.VoiceBrokenRule = false;
            // TriggerHandler.Stop();
            //  Logger.Error("allItemTasks  Stop");
            var allItemTasks = ExamItems.Select(x => x.StopAsync()).ToArray();

            try
            {
                Task.WaitAll(allItemTasks, 1000 * 10);
            }
            catch (Exception exp)
            {
                Logger.ErrorFormat("停止考试项目发生异常,原因:{0}", exp);
            }
            //  Logger.Error("allItemTasks  Stop Finish");
            //取消消息机制
            //Messenger.Unregister(this);
            try
            {
                if (!close)
                {
                    VoiceEndExam();
                    Free(true);
                    //TODO:回收资源
                    //Messenger.Send(new ExamFinishedMessage(true, !ExamScore.Failed, Context));
                    Dispose();
                    //进行资源的一个释放
                }
            }
            catch (Exception exp)
            {
                Logger.ErrorFormat("VoiceEndExam Error,原因:{0}", exp);
            }
        }
        //泸州特殊项目过滤完成了就不在自动触发
        protected override async Task MatchMapPointsAsync(CarSignalInfo signalInfo)
        {
            //只是一个条件
            if (Settings.PullOverStartFlage == false && Settings.EndExamByDistance && IsTriggerPullOver == false)
            {
                if (signalInfo.Distance >= Settings.ExamDistance)
                {
                    IsTriggerPullOver = true;
                    Logger.Info("里程达到三公里自动触发考试项目");
                    Messenger.Send <PullOverTriggerMessage>(new PullOverTriggerMessage());
                    return;
                }
            }
            //直线行驶路段忽略其它的考试项目
            if (ExamItems.Any(d => d.ItemCode == ExamItemCodes.StraightDriving && d.State != ExamItemState.Finished))
            {
                return;
            }

            var points = PointSearcher.Search(signalInfo);

            //对解除限速进行
            if (points.Any(d => d.PointType == MapPointType.UnfreezeSpeedLimit))
            {
                Messenger.Send(new EndSpeedLimitMessage());
            }
            var query = from p in points
                        where !ExamItems.Any(x => x.State != ExamItemState.Finished && x.TriggerPoint != null && x.TriggerPoint.PointType == p.PointType) &&
                        _mapTriggerPoints.All(x => x.Index != p.Index)
                        select p;

            foreach (var mapPoint in query)
            {
                var context = new ExamItemExecutionContext(Context);

                var item = DataService.AllExamItems.FirstOrDefault(x => x.MapPointType == mapPoint.PointType);
                if (item != null)
                {
                    if (Settings.PullOverStartFlage && InitPointList.Count > 0 && context.ExamMode == ExamMode.Examming)
                    {
                        Constants.IsExamMode_Luzhou = true;
                        if (item.MapPointType != MapPointType.TurnLeft && item.MapPointType != MapPointType.TurnRight)
                        {
                            //只报一次,除了左,右转
                            if (!FinishedPointList.Contains(item.MapPointType))
                            {
                                FinishedPointList.Add(item.MapPointType);
                            }
                            else
                            {
                                //播报过的项目,直接返回
                                return;
                            }
                        }
                        //////左转,右转,直行路口不过滤
                        ////if (FinishedPointList.Contains(item.MapPointType))
                        ////{
                        ////    //泸州过滤掉所有考试项目
                        ////    //if (item.ItemCode != ExamItemCodes.TurnLeft && item.ItemCode != ExamItemCodes.TurnRight &&
                        ////    //    item.ItemCode != ExamItemCodes.StraightThrough && item.ItemCode != ExamItemCodes.TurnRound
                        ////    //    && item.ItemCode != ExamItemCodes.SchoolArea && item.ItemCode != ExamItemCodes.BusArea && item.ItemCode != ExamItemCodes.PedestrianCrossing && item.ItemCode != ExamItemCodes.PedestrianCrossingHasPeople)
                        ////    {
                        ////        Logger.Info("跳过项目:" + item.ItemCode);
                        ////        continue;
                        ////    }
                        ////}

                        ////if (!FinishedPointList.Contains(item.MapPointType) && item.MapPointType != MapPointType.PullOver)
                        ////{
                        ////    FinishedPointList.Add(item.MapPointType);
                        ////    Logger.Info(item.MapPointType.ToString() + ":" + FinishedPointList.Count.ToString());
                        ////}
                    }
                    context.ItemCode = item.ItemCode;
                    ///超变会处理,相应的点位随机触发超车,变道,会车
                    if (item.ItemCode == ExamItemCodes.OvertakeChangeMeeting)
                    {
                        context.ItemCode = ExamItemCodes.GetRandomExamItemFromOvertakeChangeMeeting();
                    }
                    context.TriggerSource = ExamItemTriggerSource.Map;
                    context.Properties    = mapPoint.Properties;
                    context.TriggerPoint  = mapPoint;
                    Logger.InfoFormat("当前GPS:{0}-{1}-{2}", signalInfo.Gps.LatitudeDegrees, signalInfo.Gps.LongitudeDegrees, signalInfo.Gps.SpeedInKmh);
                    Logger.InfoFormat("点位GPS:{0}-{1}", mapPoint.Point.Latitude, mapPoint.Point.Longitude);
                    Logger.InfoFormat("相距位置:{0}米", GeoHelper.GetDistance(mapPoint.Point.Longitude, mapPoint.Point.Latitude, signalInfo.Gps.LongitudeDegrees, signalInfo.Gps.LatitudeDegrees));
                    Logger.InfoFormat("点位触发项目:{0}", item.ItemName);

                    await StartItemAsync(context, CancellationToken.None);
                }
                _mapTriggerPoints.Enqueue(mapPoint);
            }
            while (_mapTriggerPoints.Count > 2)
            {
                _mapTriggerPoints.Dequeue();
            }
        }
Exemple #8
0
        public static void SaveItem(ELearningItemModel _item, Guid?_attachmentID, out string message)
        {
            try
            {
                message = "";

                using (var db = new PhilscanExcellenceEntities())
                {
                    if (_item.ID == Guid.Empty)
                    {
                        ExamItems newItem = new ExamItems
                        {
                            ID           = Guid.NewGuid(),
                            Answer       = _item.Answer,
                            ChoiceA      = _item.ChoiceA,
                            ChoiceB      = _item.ChoiceB,
                            ChoiceC      = _item.ChoiceC,
                            ChoiceD      = _item.ChoiceD,
                            ChoiceE      = _item.ChoiceE,
                            ChoiceF      = "",
                            CreatedBy    = UniversalService.CurrentUser.ID,
                            CreatedDate  = DateTime.Now,
                            HeaderID     = _item.HeaderID,
                            Question     = _item.Question,
                            AttachmentID = _attachmentID
                        };

                        db.Entry(newItem).State = System.Data.Entity.EntityState.Added;
                    }
                    else
                    {
                        var item = db.ExamItems.FirstOrDefault(r => r.ID == _item.ID);

                        if (item != null)
                        {
                            if (_item.Status == 1)
                            {
                                item.Question = _item.Question;

                                item.ChoiceA = _item.ChoiceA;

                                item.ChoiceB = _item.ChoiceB;

                                item.ChoiceD = _item.ChoiceD;

                                item.ChoiceE = _item.ChoiceE;

                                item.CreatedDate = DateTime.Now;

                                item.CreatedBy = UniversalService.CurrentUser.ID;

                                item.AttachmentID = _attachmentID;

                                db.Entry(item).State = System.Data.Entity.EntityState.Modified;
                            }
                            else
                            {
                                db.Entry(item).State = System.Data.Entity.EntityState.Deleted;
                            }
                        }
                    }

                    db.SaveChanges();
                }
            }
            catch (Exception error)
            {
                message = error.Message;
            }
        }
Exemple #9
0
        protected override async Task MatchMapPointsAsync(CarSignalInfo signalInfo)
        {
            //只是一个条件
            if (Settings.EndExamByDistance && IsTriggerPullOver == false)
            {
                if (signalInfo.Distance >= Settings.ExamDistance)
                {
                    IsTriggerPullOver = true;
                    Logger.Info("@@里程达到三公里自动触发考试项目");
                    Messenger.Send <PullOverTriggerMessage>(new PullOverTriggerMessage());
                    return;
                }
            }

            //直线行驶路段忽略其它的考试项目
            if (ExamItems.Any(d => d.ItemCode == ExamItemCodes.StraightDriving && d.State != ExamItemState.Finished))
            {
                return;
            }

            var points = PointSearcher.Search(signalInfo);

            //对解除限速进行
            if (points.Any(d => d.PointType == MapPointType.UnfreezeSpeedLimit))
            {
                Messenger.Send(new EndSpeedLimitMessage());
            }
            var query = from p in points
                        where !ExamItems.Any(x => x.State != ExamItemState.Finished && x.TriggerPoint != null && x.TriggerPoint.PointType == p.PointType) &&
                        _mapTriggerPoints.All(x => x.Index != p.Index)
                        select p;


            foreach (var mapPoint in query)
            {
                var context = new ExamItemExecutionContext(Context);

                var item = DataService.AllExamItems.FirstOrDefault(x => x.MapPointType == mapPoint.PointType);


                //其实最简单还是要在这里处理
                if (item != null)
                {
                    //排除语音点和起步
                    if (InitPointList.Count > 0 && !item.ItemName.Contains("点"))
                    {
                        if (!examingItem.Any(x => x.Equals(item.MapPointType)) && item.MapPointType != MapPointType.VehicleStarting)
                        {
                            examingItem.Enqueue(item.MapPointType);
                            FinishedPointList.Add(item.MapPointType);
                            Logger.Info("@@加入队列项目:{0}", item.ItemName);
                        }
                        if (examingItem.Count > 1)
                        {
                            examingItem.Dequeue();
                        }
                    }
                    context.ItemCode = item.ItemCode;
                    ///超变会处理,相应的点位随机触发超车,变道,会车
                    if (item.ItemCode == ExamItemCodes.OvertakeChangeMeeting)
                    {
                        context.ItemCode = ExamItemCodes.GetRandomExamItemFromOvertakeChangeMeeting();
                    }
                    context.TriggerSource = ExamItemTriggerSource.Map;
                    context.Properties    = mapPoint.Properties;
                    context.TriggerPoint  = mapPoint;
                    Logger.InfoFormat("当前GPS:{0}-{1}-{2}", signalInfo.Gps.LatitudeDegrees, signalInfo.Gps.LongitudeDegrees, signalInfo.Gps.SpeedInKmh);
                    Logger.InfoFormat("点位GPS:{0}-{1}", mapPoint.Point.Latitude, mapPoint.Point.Longitude);
                    Logger.InfoFormat("相距位置:{0}米", GeoHelper.GetDistance(mapPoint.Point.Longitude, mapPoint.Point.Latitude, signalInfo.Gps.LongitudeDegrees, signalInfo.Gps.LatitudeDegrees));
                    Logger.InfoFormat("点位触发项目:{0}", item.ItemName);

                    await StartItemAsync(context, CancellationToken.None);
                }
                _mapTriggerPoints.Enqueue(mapPoint);
            }
            while (_mapTriggerPoints.Count > 2)
            {
                _mapTriggerPoints.Dequeue();
            }
        }