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); //} } }
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); } } }
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(); } } }
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); } }
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); } } }
/// <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(); } }
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; } }
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(); } }