108 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			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());
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |