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; }
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|