ly/Controllers/HomeController.cs

108 lines
3.8 KiB
C#

using LY.App.Common.Redis;
using LY.App.Device;
using LY.App.Model;
using LY.App.Service;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using StackExchange.Redis;
using System.Reactive.Joins;
namespace LY.App.Controllers
{
/// <summary>
/// 首页控制器
/// </summary>
[Route("api/[controller]")]
[ApiController]
public class HomeController : ControllerBase
{
private readonly DeviceService _deviceService;
private readonly DeviceManager deviceManager = DeviceManager.Instance;
private readonly PositionService _positionService;
private readonly RedisService _redisService;
private readonly AlarmService _alarmService;
private readonly WeatherService _weatherService;
/// <summary>
///
/// </summary>
/// <param name="deviceService"></param>
/// <param name="positionService"></param>
/// <param name="redisService"></param>
/// <param name="alarmService"></param>
/// <param name="weatherService"></param>
public HomeController(DeviceService deviceService, PositionService positionService,
RedisService redisService, AlarmService alarmService, WeatherService weatherService)
{
_deviceService = deviceService;
_positionService = positionService;
_redisService = redisService;
_alarmService = alarmService;
_weatherService = weatherService;
}
/// <summary>
/// 首页
/// </summary>
/// <returns></returns>
[HttpGet("index")]
public async Task<IActionResult> view()
{
ApiResult result = new ApiResult();
var positions = await _positionService.Index();
var alarmCount = await _redisService.GetOrSetAsync(RedisKeyList.index_data(),
async () => await _alarmService.IndexCount(),
TimeSpan.FromSeconds(GetLeftTime()));
var weather = await _redisService.GetOrSetAsync(RedisKeyList.Index_Weather,
async () => await _weatherService.GetWeather(),
TimeSpan.FromHours(3));
var data = await GetUserLocation();
result.data = new
{
positions,
alarmCount,
weather,
userLocation = data
};
return Ok(result);
}
private int GetLeftTime() {
DateTime now = DateTime.Now;
// 今天的结束时间 23:59:59
DateTime endOfDay = new DateTime(now.Year, now.Month, now.Day, 23, 59, 59);
// 相差时间
TimeSpan remaining = endOfDay - now;
// 剩余秒数
return (int)remaining.TotalSeconds;
}
private async Task<List<SyncLocation>> GetUserLocation()
{
var keys = await _redisService.GetAllKeysAsync("user_locationbyid_*");
List<SyncLocation> result = new List<SyncLocation>();
if (keys.Count > 0)
{
foreach (var item in keys)
{
result.Add(await _redisService.GetAsync<SyncLocation>(item));
}
}
return result;
}
/// <summary>
/// 同步移动端位置信息
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("syncLocation")]
public async Task<IActionResult> SyncLocation(SyncLocation input)
{
string key = RedisKeyList.UserLocation(input.userId);
await _redisService.SetAsync(key, new SyncLocation() { userId = input.userId, lat = input.lat, lon = input.lon }, TimeSpan.FromMinutes(1));
return Ok(new ApiResult());
}
}
}