jy-plc/Services/RadarService.cs

280 lines
9.7 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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