using Omu.ValueInjecter; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Traffic.Data.Enums; using Traffic.Data.ViewModels; using Traffic.Repository.Infrastructures; using Traffic.Service.Interfaces; namespace Traffic.Service.Implements { public class ReportService : IReportService { private readonly IUnitOfWork _unitOfWork; public ReportService(IUnitOfWork unitOfWork) { _unitOfWork = unitOfWork; } public ReportSiteEventTypesViewModel GetReportSiteEventTypes(List sites, List eventTypes, string startTime, string endTime) { try { var result = new ReportSiteEventTypesViewModel(); var events = _unitOfWork.EventRepository.GetEventBySitesAndEventType(sites, eventTypes, startTime, endTime); var siteGroup = events.GroupBy(i => i.SiteId); var eachSiteList = new List(); foreach (var s in sites) { var data = siteGroup.Where(i => i.Key == s); var siteName = _unitOfWork.SiteInformationRepository.GetSiteInformationBySiteId(s).SiteName; if (data.Any()) { var vm = new EachSiteEventTypesViewModel { SiteId = s, SiteName = siteName, NoStatusCount = data.FirstOrDefault().Count(i => Convert.ToInt16(i.Punished) == 0 && Convert.ToInt16(i.CheckPunish) == 0 && Convert.ToInt16(i.Rejected) == 0 && string.IsNullOrWhiteSpace(i.Ps)), CheckPunishCount = data.FirstOrDefault().Count(i => Convert.ToInt16(i.CheckPunish) == 1), RejectedCount = data.FirstOrDefault().Count(i => Convert.ToInt16(i.Rejected) == 1), PunishCount = data.FirstOrDefault().Count(i => Convert.ToInt16(i.Punished) == 1), NoPunishCount = data.FirstOrDefault().Count(i => Convert.ToInt16(i.Punished) == 0 && Convert.ToInt16(i.CheckPunish) == 0 && Convert.ToInt16(i.Rejected) == 0 && !string.IsNullOrWhiteSpace(i.Ps)), EventTotalCount = data.FirstOrDefault().Count() }; eachSiteList.Add(vm); } else { var vm = new EachSiteEventTypesViewModel { SiteId = s, SiteName = siteName, NoStatusCount = 0, CheckPunishCount = 0, RejectedCount = 0, PunishCount = 0, NoPunishCount = 0, EventTotalCount = 0, }; eachSiteList.Add(vm); } } var eventGroup = events.GroupBy(i => i.EventType); var eachEventList = new List(); foreach (var e in eventTypes) { var data = eventGroup.Where(i => i.Key == e); var eventName = _unitOfWork.EventTypeRepository.GetEventTypeByEventType(e).EventName; if (data.Any()) { var vm = new EachEventTypesSiteViewModel { EventName = eventName, NoStatusCount = data.FirstOrDefault().Count(i => Convert.ToInt16(i.Punished) == 0 && Convert.ToInt16(i.CheckPunish) == 0 && Convert.ToInt16(i.Rejected) == 0 && string.IsNullOrWhiteSpace(i.Ps)), CheckPunishCount = data.FirstOrDefault().Count(i => Convert.ToInt16(i.CheckPunish) == 1), RejectedCount = data.FirstOrDefault().Count(i => Convert.ToInt16(i.Rejected) == 1), PunishCount = data.FirstOrDefault().Count(i => Convert.ToInt16(i.Punished) == 1), NoPunishCount = data.FirstOrDefault().Count(i => Convert.ToInt16(i.Punished) == 0 && Convert.ToInt16(i.CheckPunish) == 0 && Convert.ToInt16(i.Rejected) == 0 && !string.IsNullOrWhiteSpace(i.Ps)), EventTotalCount = data.FirstOrDefault().Count() }; eachEventList.Add(vm); } else { var vm = new EachEventTypesSiteViewModel { EventName = eventName, NoStatusCount = 0, CheckPunishCount = 0, RejectedCount = 0, PunishCount = 0, NoPunishCount = 0, EventTotalCount = 0, }; eachEventList.Add(vm); } } result.EachSiteEventTypesViewModel = eachSiteList.OrderBy(i => i.SiteId).ToList(); result.EachEventTypesSiteViewModel = eachEventList; return result; } catch (Exception) { return new ReportSiteEventTypesViewModel(); } } public IEnumerable GetTycgTableName() { try { var datas = _unitOfWork.TycgRepository.GetTycgsTableName(); var result = new List(); foreach (var data in datas) { var vm = new TycgTableNameViewModel(); vm.InjectFrom(data); vm.Id = data.Id; if (string.IsNullOrWhiteSpace(data.APIName)) { vm.APIName = data.LogName; } result.Add(vm); } return result; } catch (Exception ex) { return new List(); } } public IEnumerable GetTycgLogAll(string tycgTableName) { try { if (string.IsNullOrWhiteSpace(tycgTableName)) { return new List(); } var datas = _unitOfWork.TycgRepository.GetTycgs(tycgTableName); var result = new List(); foreach (var data in datas) { var value = data.Value.Split(';'); var vm = new TycgViewModel(); vm.InjectFrom(data); vm.Id = data.Id; vm.Time = JavaTimeStampToDateTime(data.Timestamp); vm.ip = value.Length > 2 ? value[0] : ""; vm.api = value.Length > 2 ? value[2] : ""; result.Add(vm); } return result.OrderByDescending(i => i.Time); } catch (Exception ex) { return new List(); } } public PageViewModel> GetTycgLog(string tycgTableName, SearchModel searchModel) { try { if (string.IsNullOrWhiteSpace(tycgTableName)) { return new PageViewModel>(); } var datas = _unitOfWork.TycgRepository.GetTycgs(tycgTableName); int count = datas.Count(); int pageCount = count % searchModel.PageSize != 0 ? (count / searchModel.PageSize) + 1 : count / searchModel.PageSize; datas = datas.Skip((searchModel.Page - 1) * searchModel.PageSize).Take(searchModel.PageSize); var result = new List(); foreach (var data in datas) { var value = data.Value.Split(';'); var vm = new TycgViewModel(); vm.InjectFrom(data); vm.Id = data.Id; vm.Time = JavaTimeStampToDateTime(data.Timestamp); vm.ip = value.Length > 2 ? value[0] : ""; vm.api = value.Length > 2 ? value[2] : ""; result.Add(vm); } return new PageViewModel> { RowCount = count, PageCount = pageCount, CurrentPage = searchModel.Page, Data = result, }; } catch (Exception ex) { return new PageViewModel>(); } } private static string JavaTimeStampToDateTime(double javaTimeStamp) { // Java timestamp is milliseconds past epoch DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); var strdateTime = dateTime.AddMilliseconds(javaTimeStamp).ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"); return strdateTime; } public List GetEventType1(ReportRequestViewModel viewModel) { try { var start = Convert.ToDateTime(viewModel.StartDate).ToString("yyyy-MM-dd 00:00:00"); var end = Convert.ToDateTime(viewModel.EndDate).ToString("yyyy-MM-dd 23:59:59"); var data = _unitOfWork.EventRepository.GetEventBySitesAndEventType(viewModel.Sites, new List { "1" }, start, end); data = data.Where(i => Convert.ToDateTime(i.InTime).Hour >= viewModel.StartTime && Convert.ToDateTime(i.InTime).Hour <= viewModel.EndTime); var result = new List(); var vmdata = data.Where(i => (Convert.ToDateTime(i.OutTime) - Convert.ToDateTime(i.InTime)).Minutes > 1 && (Convert.ToDateTime(i.OutTime) - Convert.ToDateTime(i.InTime)).Minutes <= 2); var vm1 = new ReportEventType1ViewModel { DateTime = "一至兩分鐘", CarCount = vmdata.Count(i => i.VehicleType == ((int)EnumVehicleType.Car).ToString()), BusCount = vmdata.Count(i => i.VehicleType == ((int)EnumVehicleType.Coach).ToString()), TaxiCount = vmdata.Count(i => i.VehicleType == ((int)EnumVehicleType.Taxi).ToString()), MotorcycleCount = vmdata.Count(i => i.VehicleType == ((int)EnumVehicleType.Motorcycle).ToString()), HasNumber = vmdata.Count(i => !string.IsNullOrWhiteSpace(i.Number)), HasNoNumber = vmdata.Count(i => string.IsNullOrWhiteSpace(i.Number)) }; result.Add(vm1); vmdata = data.Where(i => (Convert.ToDateTime(i.OutTime) - Convert.ToDateTime(i.InTime)).Minutes > 2 && (Convert.ToDateTime(i.OutTime) - Convert.ToDateTime(i.InTime)).Minutes <= 3); var vm2 = new ReportEventType1ViewModel { DateTime = "兩至三分鐘", CarCount = vmdata.Count(i => i.VehicleType == ((int)EnumVehicleType.Car).ToString()), BusCount = vmdata.Count(i => i.VehicleType == ((int)EnumVehicleType.Coach).ToString()), TaxiCount = vmdata.Count(i => i.VehicleType == ((int)EnumVehicleType.Taxi).ToString()), MotorcycleCount = vmdata.Count(i => i.VehicleType == ((int)EnumVehicleType.Motorcycle).ToString()), HasNumber = vmdata.Count(i => !string.IsNullOrWhiteSpace(i.Number)), HasNoNumber = vmdata.Count(i => string.IsNullOrWhiteSpace(i.Number)) }; result.Add(vm2); vmdata = data.Where(i => (Convert.ToDateTime(i.OutTime) - Convert.ToDateTime(i.InTime)).Minutes > 3); var vm3 = new ReportEventType1ViewModel { DateTime = "兩至三分鐘", CarCount = vmdata.Count(i => i.VehicleType == ((int)EnumVehicleType.Car).ToString()), BusCount = vmdata.Count(i => i.VehicleType == ((int)EnumVehicleType.Coach).ToString()), TaxiCount = vmdata.Count(i => i.VehicleType == ((int)EnumVehicleType.Taxi).ToString()), MotorcycleCount = vmdata.Count(i => i.VehicleType == ((int)EnumVehicleType.Motorcycle).ToString()), HasNumber = vmdata.Count(i => !string.IsNullOrWhiteSpace(i.Number)), HasNoNumber = vmdata.Count(i => string.IsNullOrWhiteSpace(i.Number)) }; result.Add(vm3); var vm = new ReportEventType1ViewModel { DateTime = "總數", CarCount = vm1.CarCount + vm2.CarCount + vm3.CarCount, BusCount = vm1.BusCount + vm2.BusCount + vm3.BusCount, TaxiCount = vm1.TaxiCount + vm2.TaxiCount + vm3.TaxiCount, MotorcycleCount = vm1.MotorcycleCount + vm2.MotorcycleCount + vm3.MotorcycleCount, HasNumber = vm1.HasNumber + vm2.HasNumber + vm3.HasNumber, HasNoNumber = vm1.HasNoNumber + vm2.HasNoNumber + vm3.HasNoNumber, }; result.Add(vm); return result; } catch (Exception ex) { return new List(); } } public List GetEventType2(ReportRequestViewModel viewModel) { try { var start = Convert.ToDateTime(viewModel.StartDate).ToString("yyyy-MM-dd 00:00:00"); var end = Convert.ToDateTime(viewModel.EndDate).ToString("yyyy-MM-dd 23:59:59"); var data = _unitOfWork.EventRepository.GetEventBySitesAndEventType(viewModel.Sites, new List { "2" }, start, end); data = data.Where(i => Convert.ToDateTime(i.InTime).Hour >= viewModel.StartTime && Convert.ToDateTime(i.InTime).Hour <= viewModel.EndTime); var result = new List(); var vm = new ReportEventType2ViewModel { Speed = "~80 km/h", Count = data.Count(i => Convert.ToDouble(i.Speed) <= 80) }; result.Add(vm); vm = new ReportEventType2ViewModel { Speed = "80~90 km/h", Count = data.Count(i => Convert.ToDouble(i.Speed) > 80 && Convert.ToDouble(i.Speed) <= 90) }; result.Add(vm); vm = new ReportEventType2ViewModel { Speed = "90~100 km/h", Count = data.Count(i => Convert.ToDouble(i.Speed) > 90 && Convert.ToDouble(i.Speed) <= 100) }; result.Add(vm); vm = new ReportEventType2ViewModel { Speed = "100~ km/h", Count = data.Count(i => Convert.ToDouble(i.Speed) > 100) }; result.Add(vm); return result; } catch (Exception) { return new List(); } } public List GetEventType34(ReportRequestViewModel viewModel) { try { var start = Convert.ToDateTime(viewModel.StartDate).ToString("yyyy-MM-dd 00:00:00"); var end = Convert.ToDateTime(viewModel.EndDate).ToString("yyyy-MM-dd 23:59:59"); var data = _unitOfWork.EventRepository.GetEventBySitesAndEventType(viewModel.Sites, new List { "3", "4" }, start, end); data = data.Where(i => Convert.ToDateTime(i.InTime).Hour >= viewModel.StartTime && Convert.ToDateTime(i.InTime).Hour <= viewModel.EndTime); var result = new List(); var vm = new ReportEventType34ViewModel { CarCount = data.Count(i => i.VehicleType == ((int)EnumVehicleType.Car).ToString()), CoachCount = data.Count(i => i.VehicleType == ((int)EnumVehicleType.Coach).ToString()), TruckCount = data.Count(i => i.VehicleType == ((int)EnumVehicleType.Truck).ToString()), }; result.Add(vm); return result; } catch (Exception ex) { return new List(); } } public List GetEventType6(ReportRequestViewModel viewModel) { try { var start = Convert.ToDateTime(viewModel.StartDate).ToString("yyyy-MM-dd 00:00:00"); var end = Convert.ToDateTime(viewModel.EndDate).ToString("yyyy-MM-dd 23:59:59"); var data = _unitOfWork.EventRepository.GetEventBySitesAndEventType(viewModel.Sites, new List { "6" }, start, end); data = data.Where(i => Convert.ToDateTime(i.InTime).Hour >= viewModel.StartTime && Convert.ToDateTime(i.InTime).Hour <= viewModel.EndTime); var result = new List(); var vm = new ReportEventType6ViewModel { Ton = "0~15噸", Count = data.Count(i => Convert.ToDouble(i.Ton) <= 15) }; result.Add(vm); vm = new ReportEventType6ViewModel { Ton = "15~20噸", Count = data.Count(i => Convert.ToDouble(i.Ton) > 15 && Convert.ToDouble(i.Ton) <= 20) }; result.Add(vm); vm = new ReportEventType6ViewModel { Ton = "20~25噸", Count = data.Count(i => Convert.ToDouble(i.Ton) > 20 && Convert.ToDouble(i.Ton) <= 25) }; result.Add(vm); vm = new ReportEventType6ViewModel { Ton = "25~30噸", Count = data.Count(i => Convert.ToDouble(i.Ton) > 25 && Convert.ToDouble(i.Ton) <= 30) }; result.Add(vm); vm = new ReportEventType6ViewModel { Ton = "30噸以上", Count = data.Count(i => Convert.ToDouble(i.Ton) > 30) }; result.Add(vm); return result; } catch (Exception ex) { return new List(); } } public List GetMalfunction(ReportRequestViewModel viewModel) { try { DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 當地時區 var start = ((DateTimeOffset)Convert.ToDateTime(viewModel.StartDate)).ToUnixTimeSeconds().ToString(); var end = ((DateTimeOffset)Convert.ToDateTime(viewModel.EndDate).AddDays(1)).ToUnixTimeSeconds().ToString(); var data = _unitOfWork.MalfunctionRepository.GetMalfunctions(viewModel.Sites, start, end); var result = new List(); foreach (var item in data) { DateTime dt = startTime.AddSeconds(Convert.ToInt32(item.Timestamp)); var vm = new ReportMalfunctionViewModel { Time = dt.ToString("yyyy-MM-dd HH:mm:ss"), SiteId = item.Siteid, SiteName = item.SiteName, CompanyCode = item.CompanyCode, DeviceID = item.DeviceID, DeviceType = item.DeviceType, Message = item.Message, }; result.Add(vm); } result = result.Where(i => Convert.ToDateTime(i.Time).Hour >= viewModel.StartTime && Convert.ToDateTime(i.Time).Hour < viewModel.EndTime + 1).ToList(); result = result.OrderBy(i => i.SiteId).ToList(); return result; } catch (Exception ex) { return new List(); } } } }