Advertisement
Guest User

Untitled

a guest
Mar 30th, 2020
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 39.58 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel.DataAnnotations;
  4. using System.Configuration;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using System.Web;
  9. using System.Web.Mvc;
  10. using Waypoint.ActionFilters;
  11. using Waypoint.Areas.Tracking.Models;
  12. using Waypoint.BusinessLogic;
  13. using Waypoint.CommandsEngine;
  14. using Waypoint.Controllers;
  15. using Waypoint.DAL;
  16. using Waypoint.Helpers;
  17. using Waypoint.Models;
  18. using Waypoint.Models.Queries;
  19. using Waypoint.Models.Results;
  20. using Waypoint.Utils;
  21.  
  22. namespace Waypoint.Areas.Rental.Controllers
  23. {
  24. [Authenticate]
  25. [RbacAuthorize(PermissionName = "RentalMaps")]
  26. public class TrackingController : WaypointController
  27. {
  28. public QueryProcessor _QueryProcessor { get; set; }
  29.  
  30. private int _ConnectionOverdueTime = Convert.ToInt32(ConfigurationManager.AppSettings["ConnOverdueTime"]);
  31. private int _ConnectionOverdueTime_White = Convert.ToInt32(ConfigurationManager.AppSettings["ConnOverdueTime_White"]);
  32. protected RfidManager _rfidManager;
  33. private VideoManager _videoManager;
  34. bool _isVideoEnabled=false;
  35. public TrackingController()
  36. {
  37. var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["WaypointConnStr"].ConnectionString;
  38. _QueryProcessor = new QueryProcessor(connectionString);
  39. _rfidManager = new RfidManager();
  40. _videoManager = new VideoManager();
  41.  
  42. var isVideoEnabled = ConfigurationManager.AppSettings["IsVideoEnabled"];
  43. if(!string.IsNullOrEmpty(isVideoEnabled))
  44. {
  45. _isVideoEnabled = Boolean.Parse( isVideoEnabled);
  46. }
  47. }
  48.  
  49. public ActionResult Index(string name)
  50. {
  51. PersistUserSettings();
  52.  
  53. var vehiclesManager = new VehicleManager();
  54. ViewBag.VehiclesList = vehiclesManager.GetVehicles(UserInfo.TenantId, UserInfo.UserId, this.IsSysAdmin(), orderBy: "Name").Select(v => new { Name = v.Name, Id = v.VehicleId,ChassisNo = v.ChassisNo });
  55.  
  56. var localTime = DateTime.UtcNow.ToLocalTime(UserInfo.Settings.TimeZone);
  57. var startOfDayTime = TimeSpan.FromHours(6);
  58. var endOfDayTime = TimeSpan.FromHours(18);
  59. ViewBag.IsDayTime = localTime.TimeOfDay >= startOfDayTime && localTime.TimeOfDay < endOfDayTime;
  60.  
  61. var tenant = new TenantManager().GetTenant(UserInfo.TenantId);
  62. ViewBag.Tenant = tenant;
  63. ViewBag.IsTripSnapped = (tenant.Name.ToLowerInvariant() != "abra");
  64. ViewBag.IsVideoEnabled = tenant.Name.ToLowerInvariant().Contains("acacus") || tenant.Name.ToLowerInvariant().Contains("demo") || tenant.Name.ToLowerInvariant().Contains("dtc");
  65. ViewBag.IsAnimateTrip = tenant.Name.ToLowerInvariant().Contains("acacus") || tenant.Name.ToLowerInvariant().Contains("demo");
  66. ViewBag.IsShiftsEnabled = tenant.Name.ToLowerInvariant().Contains("acacus") || tenant.Name.ToLowerInvariant().Contains("demo") || _isVideoEnabled ;
  67.  
  68. ViewBag.DateFormat = "MM/DD/YYYY HH:mm:ss"; //GetFormatDate() ?? "dd/MM/yyyy HH:mm";
  69. ViewBag.DateFormatWithoutTime = GetFormatDateWithoutTime() ?? "dd/MM/yyyy";
  70. ViewBag.CalenderDate = GetCalenderFormatDateWithoutTime() ?? "dd/mm/yyyy";
  71. ViewBag.MapStyle = PageSettings?.MapFormat ?? MapFormat.Satellite;
  72.  
  73. ViewBag.MapRefreshTime = PageSettings?.MapRefreshTime ?? MapRefreshTime.OneMinute;
  74. ViewBag.UnitOfDistance = PageSettings?.UnitOfDistance ?? UnitOfDistance.Km;
  75. ViewBag.UnitOfSpeed = PageSettings?.UnitOfSpeed ?? UnitOfSpeed.KmHr;
  76. ViewBag.DateFormat = PageSettings?.DateFormat ?? DateFormat.DayMonthYear;
  77. ViewBag.TimeFormat = PageSettings?.TimeFormat ?? TimeFormat.TwentyFourHour;
  78. ViewBag.Name = name;
  79. ViewBag.IsAutoRecording = PageSettings.IsAutoRecording;
  80. ViewBag.RecordingPeriod = PageSettings.PeriodOfRecording;
  81. ViewBag.freezeMapDeclustering = ConfigurationManager.AppSettings["freezeMapDeclustering"].ToString().ToLower();
  82.  
  83. ViewBag.LocalDate = DateTime.UtcNow.ToLocalTime(UserInfo.Settings.TimeZone).Date;
  84. ViewBag.EnableDirectionMap = false;
  85.  
  86. var enumData = from VehicleState e in Enum.GetValues(typeof(VehicleState))
  87. select new
  88. {
  89. Id = (int)e,
  90. Name = e.ToString()
  91. };
  92.  
  93. ViewBag.VehicleStates = new SelectList(enumData, "Id", "Name");
  94.  
  95. string enableDirectionMap= ConfigurationManager.AppSettings["EnableDirectionMap"];
  96. bool enableDirectionMapValue = false;
  97. if (!string.IsNullOrEmpty(enableDirectionMap) && bool.TryParse(enableDirectionMap, out enableDirectionMapValue))
  98. {
  99. ViewBag.EnableDirectionMap = enableDirectionMapValue;
  100. }
  101. bool isMultiStreamingEnabled ;
  102. string isMultiStreamingEnabledValue = ConfigurationManager.AppSettings["IsMultiStreamingEnabled"];
  103. bool.TryParse(isMultiStreamingEnabledValue, out isMultiStreamingEnabled);
  104. ViewBag.IsMultiStreamingEnabled = isMultiStreamingEnabled;
  105. return View();
  106. }
  107.  
  108. public ActionResult Mobile()
  109. {
  110. PersistUserSettings();
  111.  
  112. var vehiclesManager = new VehicleManager();
  113. ViewBag.VehiclesList = vehiclesManager.GetVehicles(UserInfo.TenantId, UserInfo.UserId, this.IsSysAdmin(), orderBy: "Name").Select(v => new { Name = v.Name, Id = v.VehicleId });
  114.  
  115. var localTime = DateTime.UtcNow.ToLocalTime(UserInfo.Settings.TimeZone);
  116. var startOfDayTime = TimeSpan.FromHours(6);
  117. var endOfDayTime = TimeSpan.FromHours(18);
  118. ViewBag.IsDayTime = localTime.TimeOfDay >= startOfDayTime && localTime.TimeOfDay < endOfDayTime;
  119.  
  120. var tenant = new TenantManager().GetTenant(UserInfo.TenantId);
  121. ViewBag.Tenant = tenant;
  122. ViewBag.IsTripSnapped = (tenant.Name.ToLowerInvariant() != "abra");
  123.  
  124. return View();
  125. }
  126.  
  127. [HttpPost]
  128. public JsonResult UpdateTripAddress(long tripId, bool isFirstAddress, string address)
  129. {
  130. new TripManager().UpdateTripLocation(tripId, isFirstAddress, address);
  131. return new JsonResult();
  132. }
  133.  
  134. //[HttpGet]
  135. [HttpPost]
  136. public async Task<ActionResult> TrackingDataForMap(TrackingDataForMapRequestViewModel model)
  137. {
  138. //model.FromDate = model.FromDate.AddDays(-4);
  139. //model.ToDate = model.ToDate.AddDays(-2);
  140.  
  141.  
  142. ViewContext vc = new ViewContext();
  143. var queryAllVehicles = new TrackingQuery
  144. {
  145. Time = TimeSpan.FromDays(90), // 3 months
  146. TenantId = UserInfo.TenantId,
  147. VehicleId = 0,
  148. IncludeAlerts = true,
  149. Filter = model.Filter,
  150. OnlyLastLocation = true,
  151. UserId = UserInfo.UserId,
  152. IsAdminUser = this.IsSysAdmin(),
  153. VehicleState = model.VehicleState
  154. };
  155.  
  156. var dataAllVehicles = await _QueryProcessor.Process<TrackingQuery, List<TrackingQueryResult>>(queryAllVehicles);
  157. var tripSummaryMap = await GetTripsSummary(new VehicleTripsQuery
  158. {
  159. TenantId = UserInfo.TenantId,
  160. VehicleId = 0,
  161. FromDate = model.FromDate,
  162. ToDate = model.ToDate,
  163. TimeZone = UserInfo.Settings.TimeZone,
  164. UserId = UserInfo.UserId,
  165. IsAdminUser = this.IsSysAdmin(),
  166. IsDTCUser = vc.Controller.IsDTCTenant(),
  167.  
  168. }
  169. .WithFromTime(model.FromTime)
  170. .WithToTime(model.ToTime));
  171.  
  172. foreach (var d in dataAllVehicles)
  173. {
  174. d.IsNoSignal = _GetIsNoSignal(d.TrackingItems.Last().TimeStamp);
  175. d.IsNoSignal_White = _GetIsNoSignal_White(d.TrackingItems.Last().TimeStamp);
  176. foreach (var t in d.TrackingItems)
  177. {
  178. t.TimeStamp = t.TimeStamp.ToLocalTime(UserInfo.Settings.TimeZone);
  179. t.CreationDate = t.CreationDate.ToLocalTime(UserInfo.Settings.TimeZone);
  180. }
  181. d.TimeStamp = d.TrackingItems.First().TimeStamp;
  182.  
  183. TripSummary tripSummary;
  184. if (tripSummaryMap.TryGetValue(d.VehicleId, out tripSummary))
  185. {
  186. d.AlertCount = tripSummary.AlertCount;
  187. d.TripCount = tripSummary.TripCount;
  188. d.HarshBrakingCount = tripSummary.HarshBrakingCount;
  189. d.IdlingAlertCount = tripSummary.IdlingAlertCount;
  190. }
  191. }
  192.  
  193. var querySelectedVehicle = new TrackingQuery
  194. {
  195. Time = TimeSpan.FromHours(model.Hours),
  196. TenantId = UserInfo.TenantId,
  197. VehicleId = model.SelectedVehicleId,
  198. IncludeAlerts = true,
  199. OnlyLastLocation = false
  200. };
  201.  
  202. var result = new TrackingDataForMapResponseViewModel
  203. {
  204. TrackingAllVehicles = dataAllVehicles,
  205. SelectedVehicleId = model.SelectedVehicleId
  206. };
  207.  
  208. if (false && model.SelectedVehicleId > 0)
  209. {
  210. var dataSelectedVehicle = await _QueryProcessor.Process<TrackingQuery, List<TrackingQueryResult>>(querySelectedVehicle);
  211. foreach (var d in dataSelectedVehicle)
  212. {
  213. d.IsNoSignal = _GetIsNoSignal(d.TrackingItems.Last().TimeStamp);
  214. d.IsNoSignal_White = _GetIsNoSignal_White(d.TrackingItems.Last().TimeStamp);
  215. foreach (var t in d.TrackingItems)
  216. {
  217. t.TimeStamp = t.TimeStamp.ToLocalTime(UserInfo.Settings.TimeZone);
  218. t.CreationDate = t.CreationDate.ToLocalTime(UserInfo.Settings.TimeZone);
  219. }
  220. }
  221. result.TrackingSelectedVehicle = dataSelectedVehicle;
  222. }
  223.  
  224. var querySelectedVehicleTrips = new VehicleTripsQuery
  225. {
  226. TenantId = UserInfo.TenantId,
  227. VehicleId = model.SelectedVehicleId,
  228. FromDate = model.FromDate,
  229. ToDate = model.ToDate,
  230. TimeZone = UserInfo.Settings.TimeZone,
  231. IsDTCUser = vc.Controller.IsDTCTenant()
  232. }
  233. .WithFromTime(model.FromTime)
  234. .WithToTime(model.ToTime);
  235.  
  236. if (true && model.SelectedVehicleId > 0)
  237. {
  238. var trips = await _QueryProcessor.Process<VehicleTripsQuery, List<VehicleTripResult>>(querySelectedVehicleTrips);
  239. foreach (var trip in trips)
  240. {
  241. trip.CreationDate = trip.CreationDate.ToLocalTime(UserInfo.Settings.TimeZone);
  242. trip.StartedOn = trip.StartedOn.ToLocalTime(UserInfo.Settings.TimeZone);
  243. trip.FinishedOn = trip.FinishedOn.ToLocalTime(UserInfo.Settings.TimeZone);
  244.  
  245. _MapXTrips(trip);
  246. }
  247. trips.Reverse();
  248. result.Trips = trips;
  249.  
  250. var vehicleStatusQuery = new LastVehicleStatusQuery
  251. {
  252. TenantId = UserInfo.TenantId,
  253. VehicleId = model.SelectedVehicleId
  254. };
  255.  
  256. if (model.IsMobile)
  257. {
  258. var status = await _QueryProcessor.Process<LastVehicleStatusQuery, LastVehicleStatusQueryResult>(vehicleStatusQuery);
  259.  
  260. status.TimeStamp = status.TimeStamp.ToLocalTime(UserInfo.Settings.TimeZone);
  261. status.CommandDate = status.CommandDate.ToLocalTime(UserInfo.Settings.TimeZone);
  262. status.ConfirmedOn = status.ConfirmedOn.ToLocalTime(UserInfo.Settings.TimeZone);
  263. status.ReceivedConfirmOn = status.ReceivedConfirmOn.ToLocalTime(UserInfo.Settings.TimeZone);
  264. status.SentOn = status.SentOn.ToLocalTime(UserInfo.Settings.TimeZone);
  265.  
  266. result.Status = status;
  267. }
  268. }
  269.  
  270. var lastAlerts = await _QueryProcessor.Process<LastTriggeredAlertsQuery, List<LastTriggeredAlertResult>>(new LastTriggeredAlertsQuery { Count = 10, TenantId = UserInfo.TenantId });
  271. var dateTimeFormat = GetFormatDate(false);
  272. foreach (var alert in lastAlerts)
  273. {
  274. alert.FirstTime = alert.FirstTime.ToLocalTime(UserInfo.Settings.TimeZone);
  275. alert.LastTime = alert.FirstTime.ToLocalTime(UserInfo.Settings.TimeZone);
  276. alert.FirstTimeFormatted = alert.FirstTime.ToString($"ddd {dateTimeFormat}");
  277. }
  278. result.LastAlerts = lastAlerts;
  279.  
  280.  
  281. return JsonNet(result, Results.JsonNetResultOptions.AllowGet);
  282. }
  283.  
  284. [HttpPost]
  285. public async Task<ActionResult> GetAreas()
  286. {
  287.  
  288. var areas = new AreaManager().GetAreas(UserInfo.TenantId)
  289. .Where(x => x.Target != AreaTargets.None)
  290. .Select(x=> new ViewModels.AreaViewModel { Id = x.AreaId, Name = x.Name, Target = x.Target, Shape = x.Shape, Description=x.Description })
  291. .ToList();
  292.  
  293. var result = await Task.FromResult<List<ViewModels.AreaViewModel>>(areas);
  294.  
  295. return JsonNet(result, Results.JsonNetResultOptions.None);
  296. }
  297.  
  298. [HttpPost]
  299. public ActionResult GetAlertVideos(DateTime from, DateTime to, string vehicleName)
  300. {
  301. var result = _videoManager.GetAlertVideos(from, to, vehicleName,UserInfo.TenantId);
  302. return JsonNet(result);
  303. }
  304.  
  305.  
  306.  
  307. [HttpPost]
  308. public async Task<ActionResult> Trips(TrackingDataForMapRequestViewModel model)
  309. {
  310. ViewContext vc = new ViewContext();
  311.  
  312. var result = new TrackingDataForMapResponseViewModel
  313. {
  314. SelectedVehicleId = model.SelectedVehicleId
  315. };
  316.  
  317. var querySelectedVehicleTrips = new VehicleTripsQuery
  318. {
  319. TenantId = UserInfo.TenantId,
  320. VehicleId = model.SelectedVehicleId,
  321. FromDate = model.FromDate,
  322. ToDate = model.ToDate,
  323. TimeZone = UserInfo.Settings.TimeZone,
  324. IsDTCUser = vc.Controller.IsDTCTenant()
  325. }
  326. .WithFromTime(model.FromTime)
  327. .WithToTime(model.ToTime);
  328.  
  329. if (model.SelectedVehicleId > 0)
  330. {
  331. var trips = await _QueryProcessor.Process<VehicleTripsQuery, List<VehicleTripResult>>(querySelectedVehicleTrips);
  332. trips.Reverse();
  333.  
  334. foreach (var trip in trips)
  335. {
  336. trip.CreationDate = trip.CreationDate.ToLocalTime(UserInfo.Settings.TimeZone);
  337. trip.StartedOn = trip.StartedOn.ToLocalTime(UserInfo.Settings.TimeZone);
  338. trip.FinishedOn = trip.FinishedOn.ToLocalTime(UserInfo.Settings.TimeZone);
  339. _MapXTrips(trip);
  340. }
  341. result.Trips = trips;
  342. }
  343.  
  344. querySelectedVehicleTrips.VehicleId = 0;
  345. var tripsSummaryAllVehicles = await GetTripsSummary(querySelectedVehicleTrips);
  346. result.TripsSummary = tripsSummaryAllVehicles;
  347.  
  348. return JsonNet(result, Results.JsonNetResultOptions.AllowGet);
  349. }
  350.  
  351. private void _MapXTrips(VehicleTripResult trip)
  352. {
  353. if (trip.IsXTrip)
  354. {
  355. if (trip.XStartOdometer.HasValue)
  356. {
  357. trip.StartDistance = trip.XStartOdometer.Value;
  358. }
  359. if (trip.XFinishOdometer.HasValue)
  360. {
  361. trip.FinishDistance = trip.XFinishOdometer.Value;
  362. }
  363. if (trip.XStartLoggedTimeUtc.HasValue)
  364. {
  365. trip.StartedOn = trip.XStartLoggedTimeUtc.Value.ToLocalTime(UserInfo.Settings.TimeZone);
  366. }
  367. if (trip.XFinishLoggedTimeUtc.HasValue)
  368. {
  369. trip.FinishedOn = trip.XFinishLoggedTimeUtc.Value.ToLocalTime(UserInfo.Settings.TimeZone);
  370. }
  371. }
  372. }
  373.  
  374. public async Task<ActionResult> TripDetails(VehicleTripResult model)
  375. {
  376. var trip = new TripManager().GetTrip(model.TripId);
  377.  
  378. var query = new TripDetailQuery
  379. {
  380. TenantId = UserInfo.TenantId,
  381. VehicleId = trip.VehicleId,
  382. FromCrumbId = trip.OriginId,
  383. ToCrumbId = trip.DestinationId.GetValueOrDefault(),
  384. TimeFrom = trip.StartedOn.GetValueOrDefault(),
  385. TimeTo = trip.FinishedOn.GetValueOrDefault(),
  386. IncludeAlerts = true
  387. };
  388.  
  389. var track = await _QueryProcessor.Process<TripDetailQuery, List<TrackingQueryResult>>(query);
  390. foreach (var t in track)
  391. {
  392. foreach (var ti in t.TrackingItems)
  393. {
  394. ti.TimeStamp = ti.TimeStamp.ToLocalTime(UserInfo.Settings.TimeZone);
  395. ti.CreationDate = ti.CreationDate.ToLocalTime(UserInfo.Settings.TimeZone);
  396.  
  397. foreach (var ta in ti.TrackingAlerts)
  398. {
  399. ta.FirstTime = ta.FirstTime.ToLocalTime(UserInfo.Settings.TimeZone);
  400. ta.LastTime = ta.LastTime.ToLocalTime(UserInfo.Settings.TimeZone);
  401. }
  402. }
  403. }
  404. var result = track;
  405.  
  406. return JsonNet(result, Results.JsonNetResultOptions.AllowGet);
  407. }
  408.  
  409. //[HttpGet]
  410. [HttpPost]
  411. public async Task<ActionResult> TrackingDataForReport(TrackingDataForReportRequestViewModel options)
  412. {
  413. var pageSize = 20;
  414. var query = new VehicleQuery
  415. {
  416. IncludeRfid = true,
  417. TennantId = UserInfo.TenantId,
  418.  
  419. From = options.From ?? DateTime.Now.Date,
  420. To = options.To ?? DateTime.Now,
  421.  
  422. CrewName = options.CrewName,
  423. CrewPhone = options.CrewPhone,
  424. CrewRfid = options.CrewRfid,
  425.  
  426. VehicleName = options.VehicleName,
  427. VehiclePhone = options.VehiclePhone,
  428. VehiclePlateNo = options.VehiclePlateNo
  429. }.WithPaging(options.Page, pageSize);
  430.  
  431. var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["WaypointConnStr"].ConnectionString;
  432. var handler = new QueryProcessor(connectionString);
  433. var data = await handler.Process<VehicleQuery, List<VehicleQueryResult>>(query);
  434. var count = await handler.Process<VehicleCountQuery, int>(new VehicleCountQuery(query));
  435.  
  436. foreach (var d in data)
  437. {
  438. d.FirstTime = d.FirstTime.ToLocalTime(UserInfo.Settings.TimeZone);
  439. d.LastTime = d.LastTime.ToLocalTime(UserInfo.Settings.TimeZone);
  440. foreach (var r in d.RfidItems)
  441. {
  442. r.RfidScannedOn = r.RfidScannedOn.ToLocalTime(UserInfo.Settings.TimeZone);
  443. }
  444. }
  445.  
  446. var result = new TrackingDataForReportResponseViewModel
  447. {
  448. Data = data,
  449. Count = count,
  450. PageSize = pageSize,
  451. Page = options.Page,
  452. Pages = (int) Math.Ceiling(count / (pageSize + 0.0M))
  453. };
  454.  
  455. return JsonNet(result);
  456. }
  457.  
  458. [HttpPost]
  459. public async Task<ActionResult> LastLocations(LastLocationsRequestViewModel options)
  460. {
  461. var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["WaypointConnStr"].ConnectionString;
  462. var query = new LastVehicleLocationsQuery
  463. {
  464. VehicleId = options.VehicleId,
  465. TenantId = UserInfo.TenantId,
  466. Count = 5
  467. };
  468.  
  469. var handler = new QueryProcessor(connectionString);
  470. var data = await handler.Process<LastVehicleLocationsQuery, LastVehicleLocationsQueryResult>(query);
  471. var result = new LastLocationsResponseViewModel
  472. {
  473. Locations = data.Locations
  474. };
  475.  
  476. return JsonNet(result);
  477. }
  478.  
  479. [HttpPost]
  480. public async Task<ActionResult> GetContracts(GetContractsRequestViewModel model)
  481. {
  482. var contractQuery = new ContractQuery
  483. {
  484. TenantId = UserInfo.TenantId,
  485. VehicleId = model.ContractVehicleId.GetValueOrDefault(),
  486. ContractName = model.ContractName,
  487. ContractNumber = model.ContractNumber,
  488. DeviceIMEI = model.ContractDeviceIMEI,
  489. SIMCard = model.ContractSimCard,
  490. From = model.ContractFrom,
  491. To = model.ContractTo,
  492. IncludeDetails = true
  493. }.WithPaging(model.ContractPage.GetValueOrDefault(), 10);
  494.  
  495. var contracts = await _QueryProcessor.Process<ContractQuery, List<ContractQueryResult>>(contractQuery);
  496.  
  497. var contractCountQuery = new ContractCountQuery(contractQuery);
  498. var contractCount = await _QueryProcessor.Process<ContractCountQuery, int>(contractCountQuery);
  499.  
  500. var result = new GetContractsResponseViewModel
  501. {
  502. Contracts = contracts,
  503. Count = contractCount
  504. };
  505.  
  506. return JsonNet(result);
  507. }
  508.  
  509. [HttpPost]
  510. public async Task<ActionResult> VehicleStatus(VehicleStatusRequestViewModel model)
  511. {
  512. try
  513. {
  514. DeviceTypeManager deviceTypeManager = new DeviceTypeManager();
  515. var vehicleStatusQuery = new LastVehicleStatusQuery
  516. {
  517. TenantId = UserInfo.TenantId,
  518. VehicleId = model.VehicleId
  519. };
  520.  
  521. var result = await _QueryProcessor.Process<LastVehicleStatusQuery, LastVehicleStatusQueryResult>(vehicleStatusQuery);
  522.  
  523. result.TimeStamp = result.TimeStamp.ToLocalTime(UserInfo.Settings.TimeZone);
  524. result.CommandDate = result.CommandDate.ToLocalTime(UserInfo.Settings.TimeZone);
  525. result.ConfirmedOn = result.ConfirmedOn.ToLocalTime(UserInfo.Settings.TimeZone);
  526. result.ReceivedConfirmOn = result.ReceivedConfirmOn.ToLocalTime(UserInfo.Settings.TimeZone);
  527. result.SentOn = result.SentOn.ToLocalTime(UserInfo.Settings.TimeZone);
  528.  
  529. if (model.LiveTracking)
  530. {
  531. var lastCrumb = new CrumbManager().GetCrumb(model.LastCrumbId, UserInfo.TenantId);
  532.  
  533.  
  534. var query = new TripDetailQuery
  535. {
  536. TenantId = UserInfo.TenantId,
  537. VehicleId = model.VehicleId,
  538. FromCrumbId = model.LastCrumbId + 1,
  539. ToCrumbId = 0,
  540. TimeFrom = model.LastCrumbId == 0 ? DateTime.UtcNow.Subtract(TimeSpan.FromMinutes(15)) : lastCrumb != null ? lastCrumb.TimeStamp: DateTime.UtcNow.Subtract(TimeSpan.FromMinutes(15)),
  541. IncludeAlerts = true
  542. };
  543.  
  544. var track = await _QueryProcessor.Process<TripDetailQuery, List<TrackingQueryResult>>(query);
  545.  
  546. if (track.Count == 0 && model.LastCrumbId == 0)
  547. {
  548. query.OnlyLast = true;
  549. track = await _QueryProcessor.Process<TripDetailQuery, List<TrackingQueryResult>>(query);
  550. }
  551.  
  552. foreach (var t in track)
  553. {
  554. foreach (var ti in t.TrackingItems)
  555. {
  556. ti.TimeStamp = ti.TimeStamp.ToLocalTime(UserInfo.Settings.TimeZone);
  557. ti.CreationDate = ti.CreationDate.ToLocalTime(UserInfo.Settings.TimeZone);
  558. }
  559. }
  560.  
  561. result.Track = track;
  562. result.Query = query;
  563. }
  564.  
  565. var formatDate = GetFormatDate(true);
  566. var deviceType = result.StreamingDeviceType;
  567.  
  568. result.ChannelCount = deviceTypeManager.GetDeviceTypes().Where(x => x.Code == result.StreamingDeviceType).FirstOrDefault().ChannelsCount;
  569. result.Rfids = _rfidManager.GetLastTen(model.FromDate, model.ToDate,model.VehicleId, UserInfo.Settings.TimeZone).ToList();
  570. foreach (var rfid in result.Rfids)
  571. {
  572. rfid.ScannedOn = rfid.ScannedOn.ToLocalTime(UserInfo.Settings.TimeZone);
  573. rfid.ScannedOnFormatted = rfid.ScannedOn.ToString(formatDate);
  574. }
  575. return JsonNet(result);
  576. }
  577. catch (Exception e)
  578. {
  579. return JsonNet(new ErrorResult
  580. {
  581. Error = e.Message,
  582. Message = "Error retreiving Vehicle data. Please Refresh."
  583. });
  584. }
  585. }
  586.  
  587. [HttpPost]
  588. public async Task<ActionResult> SendCommand(VehicleStatusRequestViewModel model)
  589. {
  590. const int EnableCommand = 0;
  591. const int DisableCommand = 1;
  592. const int CancelCommand = 2;
  593.  
  594. DeviceCommManager service = new DeviceCommManager();
  595. var vehicleStatusQuery = new LastVehicleStatusQuery
  596. {
  597. TenantId = UserInfo.TenantId,
  598. VehicleId = model.VehicleId
  599. };
  600.  
  601. var vehicle = new VehicleManager().GetVehicle(model.VehicleId, UserInfo.TenantId);
  602. var command = new CommandManager().GetCommand(1);
  603.  
  604. if (model.CommandId == CancelCommand)
  605. {
  606. using (var context = new WaypointContext())
  607. {
  608. var communication = context.DeviceCommunications
  609. .OrderByDescending(c => c.CommunicationId)
  610. .FirstOrDefault(c => c.VehicleId == model.VehicleId);
  611.  
  612. if (communication != null)
  613. {
  614. communication.Status = (int) Models.Sms.SmsStatus.UserCanceled;
  615. communication.SentMessageStatus = Models.Sms.SmsStatus.UserCanceled;
  616. communication.Error = "Command was Canceled";
  617. communication.IsError = true;
  618. communication.ConfirmedOn = DateTime.UtcNow;
  619.  
  620. var sentMessages = context.SentMessages
  621. .Where(m => m.CommunicationId == communication.CommunicationId)
  622. .ToList();
  623.  
  624. foreach (var message in sentMessages)
  625. {
  626. message.Status = Models.Sms.SmsStatus.UserCanceled;
  627. }
  628. }
  629. context.SaveChanges();
  630. }
  631.  
  632. try
  633. {
  634. var result = await _QueryProcessor.Process<LastVehicleStatusQuery, LastVehicleStatusQueryResult>(vehicleStatusQuery);
  635.  
  636. return JsonNet(result);
  637. }
  638. catch (Exception e)
  639. {
  640. return JsonNet(new ErrorResult
  641. {
  642. Error = e.Message,
  643. Message = "Error retreiving Vehicle data. Please Refresh."
  644. });
  645. }
  646. }
  647.  
  648. /*CommandId,SendingOption,Value,VehicleId*/
  649. var deviceCommunication = new DeviceCommunication();
  650. deviceCommunication.CreatedById = UserInfo.UserId;
  651. deviceCommunication.CreationDate = DateTime.UtcNow;
  652. deviceCommunication.TenantId = UserInfo.TenantId;
  653.  
  654. deviceCommunication.VehicleId = model.VehicleId;
  655. deviceCommunication.CommandId = command.CommandId;
  656. deviceCommunication.SendingOption = SendingOptions.Sms;
  657. deviceCommunication.Value = model.CommandId == 1 ? "0" : "1"; //model.CommandId.ToString();//0: Off, 1: On
  658.  
  659. var commandText = RuptelaCommandBuilder.BuildCommand(command.Format, deviceCommunication.Value);
  660.  
  661. //deviceCommunication.FinalStatusOn
  662. deviceCommunication.Status = (int) Waypoint.Models.Sms.SmsStatus.NotSent;
  663. deviceCommunication.Body = commandText;
  664. deviceCommunication.To = vehicle.DeviceSimCard.Phone;
  665. deviceCommunication.UserId = UserInfo.UserId;
  666. deviceCommunication.TriggeredAlertId = null;
  667. deviceCommunication.AlertId = null;
  668. deviceCommunication.MessageSourceType = (int) MessageSourceType.UserCommand;
  669.  
  670. var vehicleStatusManager = new VehicleStatusManager();
  671. var vehicleStatus = vehicleStatusManager.GetVehicleStatus(model.VehicleId, UserInfo.TenantId);
  672. var sendNow = (model.CommandId == DisableCommand && vehicleStatus != null && vehicleStatus.Speed > 10) == false;
  673.  
  674. if (sendNow == false)
  675. {
  676. deviceCommunication.Status = (int) Models.Sms.SmsStatus.Scheduled;
  677. deviceCommunication.SentMessageStatus = Models.Sms.SmsStatus.Scheduled;
  678. deviceCommunication.SentMessageType = SentMessageType.DisableVehicle;
  679. }
  680.  
  681.  
  682. service.AddDeviceCommunication(deviceCommunication, SentMessageType.UserCreated);
  683.  
  684. if (false && service.Result == 1)
  685. {
  686. if (sendNow)
  687. {
  688. var clickatell_username = ConfigurationManager.AppSettings["Clickatell.UserName"];
  689. var clickatell_password = ConfigurationManager.AppSettings["Clickatell.Password"];
  690. var clickatell_api_id = ConfigurationManager.AppSettings["Clickatell.ApiId"];
  691.  
  692. var smsClient = new Waypoint.Messaging.ClickatellClient.SmsClient(clickatell_username, clickatell_password, clickatell_api_id);
  693. await SendSmsCommand(service, deviceCommunication, smsClient);
  694. }
  695. }
  696.  
  697. try
  698. {
  699. var result = await _QueryProcessor.Process<LastVehicleStatusQuery, LastVehicleStatusQueryResult>(vehicleStatusQuery);
  700.  
  701. return JsonNet(result);
  702. }
  703. catch (Exception e)
  704. {
  705. return JsonNet(new ErrorResult
  706. {
  707. Error = e.Message,
  708. Message = "Error retreiving Vehicle data. Please Refresh."
  709. });
  710. }
  711. }
  712.  
  713. private async Task SendSmsCommand(DeviceCommManager service, DeviceCommunication deviceCommunication, Messaging.ClickatellClient.SmsClient smsClient)
  714. {
  715. var try_count = 0;
  716. Models.Sms.SmsMessageResult send_result = new Models.Sms.SmsMessageResult { IsOk = false };
  717. while (!send_result.IsOk && try_count <= 5)
  718. {
  719. try_count++;
  720.  
  721. send_result = await smsClient.Send(new Models.Sms.SmsMessage
  722. {
  723. To = deviceCommunication.To,
  724. Body = deviceCommunication.Body
  725. });
  726.  
  727. if (send_result.IsOk)
  728. {
  729. deviceCommunication.Reference = send_result.Reference;
  730. deviceCommunication.IsError = false;
  731. service.UpdateDeviceCommunication(deviceCommunication);
  732. break;
  733. }
  734. else
  735. {
  736. deviceCommunication.IsError = true;
  737. deviceCommunication.Error = $"{send_result.ErrorCode}: {send_result.Error}";
  738. service.UpdateDeviceCommunication(deviceCommunication);
  739. }
  740. }
  741.  
  742. if (send_result.IsOk)
  743. {
  744. try_count = 0;
  745. var t = Task.Run(async () => {
  746. Models.Sms.SmsReferenceResult enquire_result = new Models.Sms.SmsReferenceResult { IsOk = false };
  747.  
  748. while (!enquire_result.IsOk && try_count <= 5)
  749. {
  750. await Task.Delay(2000);
  751.  
  752. try_count++;
  753.  
  754. enquire_result = await smsClient.GetMessage(new Models.Sms.SmsReference
  755. {
  756. Reference = deviceCommunication.Reference
  757. });
  758.  
  759. if (enquire_result.IsOk)
  760. {
  761. deviceCommunication.FinalStatusOn = enquire_result.UpdatedOn;
  762. deviceCommunication.Status = (int)enquire_result.Status;
  763. deviceCommunication.IsConfirmed = enquire_result.Status == Models.Sms.SmsStatus.Delivered || enquire_result.Status == Models.Sms.SmsStatus.Sent;
  764. if (deviceCommunication.IsConfirmed)
  765. {
  766. deviceCommunication.ConfirmedOn = enquire_result.UpdatedOn;
  767. deviceCommunication.ReceivedConfirmOn = DateTime.UtcNow;
  768. }
  769. service.UpdateDeviceCommunication(deviceCommunication);
  770. break;
  771. }
  772. else
  773. {
  774. deviceCommunication.FinalStatusOn = enquire_result.UpdatedOn;
  775. deviceCommunication.Status = (int)enquire_result.Status;
  776. service.UpdateDeviceCommunication(deviceCommunication);
  777. }
  778. }
  779. });
  780. }
  781. }
  782.  
  783. [HttpPost]
  784. public async Task<ActionResult> ExportCsv()
  785. {
  786. var form = Request.Form["options"];
  787. var options = Newtonsoft.Json.JsonConvert.DeserializeObject<TrackingDataForReportRequestViewModel>(form);
  788.  
  789. var query = new VehicleQuery
  790. {
  791. IncludeRfid = true,
  792. TennantId = UserInfo.TenantId,
  793.  
  794. From = options.From ?? DateTime.Now.Date,
  795. To = options.To ?? DateTime.Now,
  796.  
  797. CrewName = options.CrewName,
  798. CrewPhone = options.CrewPhone,
  799. CrewRfid = options.CrewRfid,
  800.  
  801. VehicleName = options.VehicleName,
  802. VehiclePhone = options.VehiclePhone,
  803. VehiclePlateNo = options.VehiclePlateNo
  804. };
  805.  
  806. var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["WaypointConnStr"].ConnectionString;
  807. var handler = new QueryProcessor(connectionString);
  808. var data = await handler.Process<VehicleQuery, List<VehicleQueryResult>>(query);
  809. var result = new TrackingDataForReportResponseViewModel
  810. {
  811. Data = data
  812. };
  813.  
  814. var csvBldr = new StringBuilder();
  815.  
  816. csvBldr.AppendLine(@"Header,Bus,Date,IMEI,PlateNumber,FirstPositionLat,FirstPositionLng,FirstPositionTime,LastPositionLat,LastPositionLng,LastPositionTime");
  817. foreach (var v in result.Data)
  818. {
  819. csvBldr.AppendLine($"V,{v.BusName.CsvEscape()},{v.FirstTime.Date.ToString("yyyy-MM-dd").CsvEscape()},{v.IMEI.CsvEscape()},{v.PlateNo.CsvEscape()},{v.FirstLat.ToString().CsvEscape()},{v.FirstLng.ToString().CsvEscape()},{v.FirstTime.ToString("yyyy-MM-dd HH:ss").CsvEscape()},{v.LastLat.ToString().CsvEscape()},{v.LastLng.ToString().CsvEscape()},{v.LastTime.ToString("yyyy-MM-dd HH:ss").CsvEscape()}");
  820. foreach (var r in v.RfidItems.GroupBy(x=>x.Rfid))
  821. {
  822. var first = r.First();
  823. var last = r.Last();
  824. csvBldr.AppendLine($"R,{r.Key.CsvEscape()},{first.RfidName.CsvEscape()},{first.RfidMobileNo.CsvEscape()},{first.RfidScannedOn.ToString("yyyy-MM-dd HH:ss").CsvEscape()},{first.RfidLat.ToString().CsvEscape()},{first.RfidLng.ToString().CsvEscape()},{last.RfidScannedOn.ToString("yyyy-MM-dd HH:ss").CsvEscape()},{last.RfidLat.ToString().CsvEscape()},{last.RfidLng.ToString().CsvEscape()}");
  825. }
  826. }
  827. var csv = csvBldr.ToString();
  828. var bytes = System.Text.Encoding.UTF8.GetBytes(csv);
  829. return File(bytes, "text/csv", "vehicle_report_" + DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss") +".csv");
  830. }
  831.  
  832. private bool _GetIsNoSignal(DateTime timestamp)
  833. {
  834. var currentDate = DateTime.UtcNow;
  835. var isNoSignal = (currentDate - timestamp).TotalMinutes > _ConnectionOverdueTime;
  836. return isNoSignal;
  837. }
  838.  
  839. private bool _GetIsNoSignal_White(DateTime timestamp)
  840. {
  841. var currentDate = DateTime.UtcNow;
  842. var isNoSignal = (currentDate - timestamp).TotalMinutes > _ConnectionOverdueTime_White;
  843. return isNoSignal;
  844. }
  845.  
  846. private async Task<Dictionary<int, TripSummary>> GetTripsSummary(VehicleTripsQuery querySelectedVehicleTrips)
  847. {
  848. var tripSummaryMap = new Dictionary<int, TripSummary>();
  849. string constr = "";
  850. using (var context = new WaypointContext())
  851. {
  852. constr = context.Database.Connection.ConnectionString;
  853. }
  854. var handler = new VehicleTripSummeryQueryHandler(constr);
  855. var trips = await handler.Handle(querySelectedVehicleTrips)
  856. .ConfigureAwait(false);
  857.  
  858. foreach (var trip in trips)
  859. {
  860. TripSummary summary;
  861. if (tripSummaryMap.TryGetValue(trip.VehicleId, out summary))
  862. {
  863. summary.AlertCount += trip.AlertCount;
  864. summary.HarshBrakingCount += trip.HarshBrakingCount;
  865. summary.IdlingAlertCount += trip.IdlingAlertCount;
  866. summary.TripCount += 1;
  867. }
  868. else
  869. {
  870. summary = new TripSummary
  871. {
  872. VehicleId = trip.VehicleId,
  873. AlertCount = trip.AlertCount,
  874. HarshBrakingCount = trip.HarshBrakingCount,
  875. IdlingAlertCount = trip.IdlingAlertCount,
  876. TripCount = 1
  877. };
  878. tripSummaryMap[summary.VehicleId] = summary;
  879. }
  880. }
  881.  
  882. return tripSummaryMap;
  883. }
  884. }
  885.  
  886. public class TripSummary
  887. {
  888. public int VehicleId { get; set; }
  889. public int TripCount { get; set; }
  890. public int AlertCount { get; set; }
  891. public int HarshBrakingCount { get; set; }
  892. public int IdlingAlertCount { get; set; }
  893. }
  894. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement