280 lines
9.7 KiB
C#
280 lines
9.7 KiB
C#
using AutoMapper;
|
||
using LangGuan.Command.AutoMapper;
|
||
using LangGuan.Command.Model;
|
||
using LangGuan.Command.Model.EntityModel;
|
||
using Microsoft.Extensions.Configuration;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Diagnostics;
|
||
using System.IO;
|
||
using System.Linq;
|
||
using System.Linq.Expressions;
|
||
using System.Threading.Tasks;
|
||
|
||
namespace LangGuan.Services
|
||
{
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public class RadarService : BaseService<Radar>
|
||
{
|
||
private readonly IMapper _mapper;
|
||
private DeviceSerive _deviceSerive;
|
||
private RadarItemService _radarItemService;
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <param name="config"></param>
|
||
/// <param name="mapper"></param>
|
||
/// <param name="deviceSerive"></param>
|
||
/// <param name="radarItemService"></param>
|
||
public RadarService(IConfiguration config, IMapper mapper,
|
||
DeviceSerive deviceSerive, RadarItemService radarItemService) : base(config, nameof(Radar))
|
||
{
|
||
_mapper = mapper;
|
||
_deviceSerive = deviceSerive;
|
||
_radarItemService = radarItemService;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 新加数据
|
||
/// </summary>
|
||
/// <param name="request"></param>
|
||
/// <returns></returns>
|
||
public async Task<ApiResult> Add(RadarView request)
|
||
{
|
||
var entity = _mapper.Map<Radar>(request);
|
||
await _deviceSerive.Add(new Device()
|
||
{
|
||
deviceId = request.deviceId,
|
||
deviceIp = request.deviceIp,
|
||
state = 1
|
||
});
|
||
|
||
//数据量过大,这里要分开存储
|
||
var result = await base.CreateAsync(entity);
|
||
List<RadarItems> items = new List<RadarItems>();
|
||
foreach (var item in request.Signal)
|
||
{
|
||
items.Add(new RadarItems() { pid = result.Id, Signal = item });
|
||
}
|
||
await _radarItemService.AddMany(items);
|
||
return new ApiResult() { code = 0, msg = "" };
|
||
}
|
||
/// <summary>
|
||
/// 首页用图
|
||
/// </summary>
|
||
/// <param name="n"></param>
|
||
/// <returns></returns>
|
||
public async Task<List<object>> Top(int n)
|
||
{
|
||
Expression<Func<Radar, bool>> exp = filter => true;
|
||
var query = await base.GetListWithExp(exp);
|
||
var items = query.OrderByDescending(s => s.AcqTime).Take(n)
|
||
.Select(s => new
|
||
{
|
||
s.Id,
|
||
s.deviceId,
|
||
s.AcqTime,
|
||
s.DataPointNum,
|
||
s.DetectRange,
|
||
s.ExposureTime,
|
||
s.ScanAngle,
|
||
s.SystemBlind
|
||
}).ToList();
|
||
List<object> result = new List<object>();
|
||
Parallel.ForEach(items, async entry =>
|
||
{
|
||
result.Add(new
|
||
{
|
||
datetime = entry.AcqTime.AddHours(8).ToString("yyyy-MM-dd HH mm "),
|
||
items = await ConvertData(entry.DetectRange, entry.DataPointNum, entry.SystemBlind, entry.Id)
|
||
});
|
||
});
|
||
return result;
|
||
}
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <param name="start"></param>
|
||
/// <param name="end"></param>
|
||
/// <returns></returns>
|
||
public async Task<ApiResult> GetList(DateTime start, DateTime end)
|
||
{
|
||
//Stopwatch stopwatch = new Stopwatch();
|
||
//var path = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "radar", "Signal_2023.json");
|
||
//stopwatch.Start();
|
||
//FileStream fileStream = new FileStream(path, FileMode.Open);
|
||
//using (StreamReader reader = new StreamReader(fileStream))
|
||
//{
|
||
// string line = await reader.ReadToEndAsync();
|
||
//}
|
||
//stopwatch.Stop();
|
||
//Console.WriteLine("StreamReader:" + stopwatch.ElapsedMilliseconds);
|
||
//string txt = "";
|
||
//byte[] allBytes = null;
|
||
//byte[] buffer = new byte[1024];//一个1K的缓冲字节容器
|
||
//stopwatch.Reset();
|
||
//stopwatch.Start();
|
||
//using (MemoryStream ms = new MemoryStream())
|
||
//{
|
||
// using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
|
||
// {
|
||
// int positon = 0;
|
||
// while ((positon = await fs.ReadAsync(buffer, 0, buffer.Length)) > 0)
|
||
// {
|
||
// await ms.WriteAsync(buffer, 0, positon);
|
||
// }
|
||
// allBytes = ms.ToArray();
|
||
// }
|
||
|
||
//}
|
||
//if (null != allBytes)
|
||
//{
|
||
// //尝试将字节转成字符串
|
||
// txt = System.Text.Encoding.UTF8.GetString(allBytes);
|
||
// // this.richTextBox_Result.Text = txt;
|
||
|
||
//}
|
||
//var path1 = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "radar", DateTime.Now.ToString("yyyy-MM-dd") + ".txt");
|
||
//using (FileStream fs = new FileStream(path1, FileMode.OpenOrCreate, FileAccess.Write))
|
||
//{
|
||
// await fs.WriteAsync(allBytes, 0, allBytes.Length);
|
||
//}
|
||
|
||
//// string[] txtToArray = txt.Split('\r');
|
||
//// ReadData_List.Add(txtToArray);
|
||
//stopwatch.Stop();
|
||
//Console.WriteLine("MemoryStream" + stopwatch.ElapsedMilliseconds);
|
||
|
||
end = end.AddDays(1);
|
||
Expression<Func<Radar, bool>> exp = filter => filter.AcqTime >= start && filter.AcqTime < end;
|
||
var query = await base.GetListWithExp(exp);
|
||
var items = query.OrderByDescending(s => s.AcqTime)
|
||
.Select(s => new
|
||
{
|
||
s.Id,
|
||
s.deviceId,
|
||
s.AcqTime,
|
||
s.DataPointNum,
|
||
s.DetectRange,
|
||
s.ExposureTime,
|
||
s.ScanAngle,
|
||
s.SystemBlind
|
||
}).ToList();
|
||
List<object> result = new List<object>();
|
||
Parallel.ForEach(items, async entry =>
|
||
{
|
||
result.Add(new
|
||
{
|
||
datetime = entry.AcqTime.ToString("yyyy-MM-dd HH mm "),
|
||
items = await ConvertData(entry.DetectRange, entry.DataPointNum, entry.SystemBlind, entry.Id)
|
||
});
|
||
});
|
||
//var result = items.Select(async s => new
|
||
//{
|
||
// datetime = s.AcqTime.AddHours(8).ToString("yyyy-MM-dd HH mm "),
|
||
// items = await ConvertData(s.DetectRange, s.DataPointNum, s.SystemBlind, s.Id)
|
||
//}).ToList();
|
||
|
||
return new ApiResult()
|
||
{
|
||
code = 0,
|
||
data = new { items = result }
|
||
};
|
||
}
|
||
private async Task<List<radarModel>> ConvertData(double rang, double DataPointNum, double SystemBlind, string id)
|
||
{
|
||
|
||
// var count = await _radarItemService.getcount(id);
|
||
List<radarModel> radarModels = new List<radarModel>();
|
||
//里面先取度数
|
||
//取1000米的数, 1000/3
|
||
List<IEnumerable<double>> vs = new List<IEnumerable<double>>();
|
||
vs = await _radarItemService.GetByPid(id);
|
||
|
||
|
||
//角度,
|
||
var t1 = convertangle();
|
||
var t2 = convertDistance(rang, SystemBlind);
|
||
for (int i = 0; i < t1.Length; i++)
|
||
{
|
||
var temp = (vs[i]).ToList();
|
||
int m = 0;
|
||
foreach (var v in t2)
|
||
{
|
||
//如果有第一个,就直接取,
|
||
m = v == SystemBlind ? m : (int)((v - SystemBlind) / 3);
|
||
m = m == 0 ? m : m - 1;
|
||
radarModels.Add(new radarModel()
|
||
{
|
||
angle = t1[i],
|
||
distance = v,
|
||
value = Math.Round(m > temp.Count() ? temp[temp.Count() - 1] : temp[m], 2)
|
||
});
|
||
}
|
||
}
|
||
return radarModels;
|
||
}
|
||
private int[] convertangle()
|
||
{
|
||
List<int> reuslt = new List<int>();
|
||
int i = 0;
|
||
while (i < 360)
|
||
{
|
||
reuslt.Add(i);
|
||
i = i + 10;
|
||
|
||
}
|
||
return reuslt.ToArray();
|
||
|
||
}
|
||
/// <summary>
|
||
/// 计算圈数
|
||
/// </summary>
|
||
/// <param name="DetectRange"></param>
|
||
/// <param name="SystemBlind"></param>
|
||
/// <returns></returns>
|
||
private int[] convertDistance(double DetectRange, double SystemBlind)
|
||
{
|
||
List<int> reuslt = new List<int>();
|
||
reuslt.Add((int)SystemBlind);
|
||
var d1 = DetectRange - SystemBlind;
|
||
int n = 1;
|
||
while (d1 - 1000 > 0)
|
||
{
|
||
if (n == 1)
|
||
{
|
||
reuslt.Add(1000);
|
||
}
|
||
else
|
||
{
|
||
reuslt.Add(n * 1000);
|
||
}
|
||
d1 = d1 - 1000;
|
||
n++;
|
||
}
|
||
reuslt.Add((int)DetectRange);
|
||
return reuslt.ToArray();
|
||
}
|
||
/// <summary>
|
||
/// 返回结果
|
||
/// </summary>
|
||
public class radarModel
|
||
{
|
||
/// <summary>
|
||
/// 角度
|
||
/// </summary>
|
||
public int angle { get; set; }
|
||
/// <summary>
|
||
/// 距离
|
||
/// </summary>
|
||
public int distance { get; set; }
|
||
/// <summary>
|
||
/// 结果
|
||
/// </summary>
|
||
public double value { get; set; }
|
||
}
|
||
}
|
||
}
|