parking-webapi/WebApi_data_value/Controllers/Violation_car_tableController.cs
2024-09-28 01:25:42 +08:00

659 lines
30 KiB
C#
Raw 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 System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Parking_space_WebAPI.Models;
using Parking_space_WebAPI.Services;
using Parking_space_WebAPI.ViewModel;
using Parking_space_WebAPI.Authorization;
using Mysqlx;
using OfficeOpenXml;
using System.Net;
using System.Net.Http.Headers;
namespace Parking_space_WebAPI.Controllers
{
[Route("api/[controller]")]
[ApiController]
[Authorize]
[ApiExplorerSettings(GroupName = "校園外網")]
public class Violation_car_tableController : ControllerBase
{
private readonly SqlContext _context;
public Violation_car_tableController(SqlContext context)
{
_context = context;
}
#region
/// <summary>
/// 抓取所有違規車輛
/// </summary>
/// <returns></returns>
// GET: api/Violation_car_table
[HttpGet]
public async Task<ActionResult<IEnumerable<Violation_car_table>>> Getviolation_car_table()
{
var violation_car_table = await(from c in _context.violation_car_table
orderby c.create_data_time descending
select new Violation_car_table
{
license_plate_number = c.license_plate_number,
create_data_time = c.create_data_time,
violation_location_name=c.violation_location_name,
}).ToListAsync();
return violation_car_table;
}
#endregion
#region
/// <summary>
/// 透過區域名稱抓取違規車輛
/// </summary>
/// <param name="id">違規區域</param>
/// <returns></returns>
// GET: api/Violation_car_table/5
[HttpGet("violation_location_name-{id}")]
public async Task<IEnumerable<Single_violation_car_table>> GetViolation_car_table(string id)
{
var violation_car_table = await(from c in _context.violation_car_table
where c.violation_location_name == id
orderby c.create_data_time descending
select new Single_violation_car_table
{
violation_location_name = c.violation_location_name,
license_plate_number = c.license_plate_number,
create_data_time = c.create_data_time,
}
).ToListAsync();
return violation_car_table;
}
#endregion
#region
/// <summary>
/// 抓出指定違規車輛
/// </summary>
/// <param name="id">違規區域</param>
/// <param name="time">資料新增時間</param>
/// <returns></returns>
[HttpGet("location_nam-{id}-time-{time}")]
public async Task<ActionResult<Violation_car_table>> violation_location_name(string id, DateTime time)
{
var violation_car_table = await (from c in _context.violation_car_table
where c.violation_location_name == id
where c.create_data_time == time
select new Violation_car_table
{
violation_location_name = c.violation_location_name,
license_plate_number = c.license_plate_number,
create_data_time = c.create_data_time,
car_start_img = c.car_start_img,
car_end_img = c.car_end_img,
}).FirstAsync();
return violation_car_table;
}
#endregion
#region
/// <summary>
/// 更新指定違規車輛
/// </summary>
/// <param name="id">區域</param>
/// <param name="time">資料新增時間</param>
/// <returns></returns>
[HttpPut("location_nam-{id}-time-{time}")]
public async Task<IActionResult> PutViolation_car_table(string id, DateTime time,Violation_car_table violation_car_table)
{
var violation_car_table_1 = await (from c in _context.violation_car_table
where c.violation_location_name == id
where c.create_data_time == time
select c).FirstAsync();
_context.violation_car_table.Remove(violation_car_table_1);
await _context.SaveChangesAsync();
_context.violation_car_table.Add(violation_car_table);
await _context.SaveChangesAsync();
return NoContent();
}
#endregion
#region
/// <summary>
/// 獲取時間內的車輛
/// </summary>
/// <param name="id">位置名稱</param>
/// <param name="start_time">起始時間</param>
/// <param name="end_time">結束時間</param>
/// <returns></returns>
[HttpGet("location_name_1_-{id}-start_time-{start_time}-end_time-{end_time}")]
public async Task<IEnumerable<Single_violation_car_table>> GetYuntech_in_car_table_date(string id, DateTime start_time, DateTime end_time)
{
var violation_car_table = await (from c in _context.violation_car_table
where c.violation_location_name == id
where c.create_data_time >= start_time
where c.create_data_time <= end_time
select new Single_violation_car_table
{
violation_location_name = c.violation_location_name,
license_plate_number = c.license_plate_number,
create_data_time = c.create_data_time,
}).ToListAsync();
return violation_car_table;
}
#endregion
#region
/// <summary>
/// 透過車牌號碼搜尋所有資料
/// </summary>
/// <param name="id">車牌號碼 ex:ABC4321</param>
/// <returns></returns>
[HttpGet("license_plate_number-{id}")]
public async Task<IEnumerable<Single_violation_car_table>> Getlicense_plate_number(string id)
{
var in_car_table = await (from c in _context.violation_car_table
where c.license_plate_number == id
orderby c.create_data_time descending
select new Single_violation_car_table
{
violation_location_name = c.violation_location_name,
license_plate_number = c.license_plate_number,
create_data_time = c.create_data_time,
}).ToListAsync();
return in_car_table;
}
#endregion
#region
/// <summary>
/// 尋找違規次數最多
/// </summary>
/// <returns></returns>
[HttpGet("recidivists")]
public async Task<IEnumerable<object>> GetRecidivists()
{
var plateNumberOccurrences = await _context.violation_car_table
.GroupBy(c => c.license_plate_number)
.Select(group => new
{
LicensePlateNumber = group.Key,
Occurrences = group.Count()
})
.OrderByDescending(x => x.Occurrences)
.ToListAsync();
return plateNumberOccurrences;
}
#endregion
#region
/// <summary>
/// 尋找規定時間內每日違規人數
/// </summary>
/// <returns></returns>
[HttpGet("get_day_violation-{day}")]
public async Task<IEnumerable<object>> Getdayvalue(int day)
{
// 取得今日日期
DateTime today = DateTime.Today;
// 取得 30 天前的日期
DateTime DaysAgo = today.AddDays(-day);
var dateValue = new List<object>();
// 使用 for 迴圈逐日計算次數
for (int i = 1; i <= day; i++)
{
DateTime date_1 = DaysAgo;
date_1 = date_1.AddDays(i);
DateTime date_2 = DaysAgo;
date_2 = date_2.AddDays(i + 1);
var dailyCount = await _context.violation_car_table
.Where(c => c.create_data_time >= date_1.Date) // 只選擇指定日期的資料
.Where(c => c.create_data_time <= date_2.Date) // 只選擇指定日期的資料
.CountAsync(); // 計算該日期的次數
dateValue.Add(new { Date = date_1.Date, Occurrences = dailyCount });
}
return dateValue;
}
#endregion
#region
/// <summary>
/// 新增違規車輛
/// </summary>
/// <param name="violation_car_table"></param>
/// <returns></returns>
// POST: api/Violation_car_table
// To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
[HttpPost]
public async Task<ActionResult<Violation_car_table>> PostViolation_car_table(Violation_car_table violation_car_table)
{
if (_context.violation_car_table == null)
{
return Problem("Entity set 'SqlContext.violation_car_table' is null.");
}
violation_car_table.create_data_time= DateTime.Now;
_context.violation_car_table.Add(violation_car_table);
// 比對名單若與vip125名單相符合則回傳ok
var in_vip125_data = await _context.el125_car_table.FindAsync(violation_car_table.license_plate_number);
if (in_vip125_data != null)
{
return Ok();
}
// 車位數量+1
var yuntech_parking = await _context.yuntech_parking.FirstOrDefaultAsync();
if (yuntech_parking != null)
{
string now_num_str = yuntech_parking.now_num;
int now_num_int;
Int32.TryParse(now_num_str, out now_num_int);
now_num_int = now_num_int + 1;
now_num_str = now_num_int.ToString();
yuntech_parking.now_num = now_num_str;
// 保存更改
await _context.SaveChangesAsync();
}
// 比對名單若與名單相符合則上傳至其他API
var in_list_data = await _context.yuntech_parking_user_list.FindAsync(violation_car_table.license_plate_number);
if (in_list_data != null)
{
//傳送line
HttpClient httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "ykmUs2ZECQ9LDiNR4waT8w6NLXjWuYE9P8safG5xTZ6");
var content = new Dictionary<string, string>();
content.Add("message",in_list_data.user_name+" - "+in_list_data.user_license_plate_number + " 違規轉彎");
httpClient.PostAsync("https://notify-api.line.me/api/notify", new FormUrlEncodedContent(content));
}
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateException)
{
if (Violation_car_tableExists(violation_car_table.violation_location_name))
{
return Conflict();
}
else
{
throw;
}
}
return CreatedAtAction("GetViolation_car_table", new { id = violation_car_table.violation_location_name }, violation_car_table);
}
#endregion
#region
/// <summary>
/// 刪除違規車輛
/// </summary>
/// <param name="id"></param>
/// <param name="time"></param>
/// <returns></returns>
// DELETE: api/Violation_car_table/5
[HttpDelete("location_name-{id}-time-{time}")]
public async Task<IActionResult> DeleteViolation_car_table(string id, DateTime time)
{
var violation_car_table = await (from c in _context.violation_car_table
where c.violation_location_name == id
where c.create_data_time == time
select c).FirstAsync();
_context.violation_car_table.Remove(violation_car_table);
await _context.SaveChangesAsync();
return NoContent();
}
#endregion
#region 10
/// <summary>
/// 新增違規資料並比對10秒內
/// </summary>
/// <param name="violation_car_table"></param>
/// <returns></returns>
// POST: api/Violation_car_table
// To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
[AllowAnonymous]
[HttpPost("post_10s")]
public async Task<ActionResult<Violation_car_table>> PostViolation_car_table_1(Violation_car_table violation_car_table)
{
// 比對名單若與vip125名單相符合則回傳ok
var in_vip125_data = await _context.el125_car_table.FindAsync(violation_car_table.license_plate_number);
if (in_vip125_data != null)
{
return Ok();
}
violation_car_table.create_data_time = DateTime.Now;
var location_name = violation_car_table.violation_location_name;
var license_plate_number = violation_car_table.license_plate_number;
var in_car_img = violation_car_table.car_start_img;
// 若與進入車輛 則違規圖片批配
var in_car_data = await (from c in _context.yuntech_in_car_table
where c.license_plate_number == license_plate_number
where c.out_time == null
orderby c.in_time descending
select c).FirstOrDefaultAsync();
if (in_car_data != null)
{
// 处理找到记录的情况
_context.yuntech_in_car_table.Remove(in_car_data);
await _context.SaveChangesAsync();
in_car_data.out_time = DateTime.Now;
in_car_data.out_car_img = violation_car_table.car_end_img;
_context.yuntech_in_car_table.Add(in_car_data);
await _context.SaveChangesAsync();
}
//取得現在時間
DateTime time = DateTime.Now;
// 取得 10秒前的時間
DateTime time_10s_ago = time.AddSeconds(-10);
var Data_list = await _context.violation_car_table
.Where(c => c.violation_location_name == location_name)
.Where(c => c.create_data_time >= time_10s_ago) // 只選擇指定日期的資料
.ToListAsync();
//判斷10秒內有多少資料
if (Data_list.Count == 1) //只有1筆 若與全景判斷的車牌不同就替換車牌
{
if (Data_list[0].license_plate_number != license_plate_number)
{
var data = Data_list[0];
_context.violation_car_table.Remove(Data_list[0]);
await _context.SaveChangesAsync();
data.license_plate_number = license_plate_number;
if (time.Hour >= 17 || time.Hour < 6)
{
// 如果时间晚于或等于17:00或者早于6:00则同时更新车牌号码和车辆入场图片
data.car_start_img = in_car_img;
_context.violation_car_table.Add(data);
}
else
{
// 如果时间早于或等于17:00则只更新车牌号码
_context.violation_car_table.Add(data);
}
await _context.SaveChangesAsync();
// 比對名單若與名單相符合則上傳至其他API
var in_list_data_1 = await _context.yuntech_parking_user_list.FindAsync(license_plate_number);
if (in_list_data_1 != null)
{
//傳送line
HttpClient httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "ykmUs2ZECQ9LDiNR4waT8w6NLXjWuYE9P8safG5xTZ6");
var content = new Dictionary<string, string>();
content.Add("message", in_list_data_1.user_name + " - " + in_list_data_1.user_license_plate_number + " 違規轉彎");
httpClient.PostAsync("https://notify-api.line.me/api/notify", new FormUrlEncodedContent(content));
}
return Ok();
}
else
{
return Ok();
}
}
if (Data_list.Count > 1)//超過2筆
{
for (int i = 0; i < Data_list.Count; i++)
{
if (Data_list[i].license_plate_number != license_plate_number)
{
if (Data_list[i].create_data_time > time.AddSeconds(-10) && Data_list[i].create_data_time < time.AddSeconds(-3))
{
var data = Data_list[i];
_context.violation_car_table.Remove(Data_list[0]);
await _context.SaveChangesAsync();
data.license_plate_number = license_plate_number;
_context.violation_car_table.Add(data);
await _context.SaveChangesAsync();
// 比對名單若與名單相符合則上傳至其他API
var in_list_data_1 = await _context.yuntech_parking_user_list.FindAsync(license_plate_number);
if (in_list_data_1 != null)
{
//傳送line
HttpClient httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "ykmUs2ZECQ9LDiNR4waT8w6NLXjWuYE9P8safG5xTZ6");
var content = new Dictionary<string, string>();
content.Add("message", in_list_data_1.user_name + " - " + in_list_data_1.user_license_plate_number + " 違規轉彎");
httpClient.PostAsync("https://notify-api.line.me/api/notify", new FormUrlEncodedContent(content));
}
return Ok();
}
}
}
}
_context.violation_car_table.Add(violation_car_table);
await _context.SaveChangesAsync();
// 車位數量+1
var yuntech_parking = await _context.yuntech_parking.FirstOrDefaultAsync();
if (yuntech_parking != null)
{
string now_num_str = yuntech_parking.now_num;
int now_num_int;
Int32.TryParse(now_num_str, out now_num_int);
now_num_int = now_num_int + 1;
now_num_str = now_num_int.ToString();
yuntech_parking.now_num = now_num_str;
// 保存更改
await _context.SaveChangesAsync();
}
// 比對名單若與名單相符合則上傳至其他API
var in_list_data = await _context.yuntech_parking_user_list.FindAsync(license_plate_number);
if (in_list_data != null)
{
//傳送line
HttpClient httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "ykmUs2ZECQ9LDiNR4waT8w6NLXjWuYE9P8safG5xTZ6");
var content = new Dictionary<string, string>();
content.Add("message", in_list_data.user_name + " - " + in_list_data.user_license_plate_number + " 違規轉彎");
httpClient.PostAsync("https://notify-api.line.me/api/notify", new FormUrlEncodedContent(content));
}
return Ok();
}
#endregion
#region EXCEL
/// <summary>
/// 生成全部違規車輛EXCEL
/// </summary>
/// <returns></returns>
[HttpGet("export-all_excel")]
public async Task<IActionResult> GenerateExcel()
{
var violation_car_table = await(from c in _context.violation_car_table
orderby c.create_data_time descending
select new Violation_car_table
{
license_plate_number = c.license_plate_number,
create_data_time = c.create_data_time,
violation_location_name = c.violation_location_name,
}).ToListAsync();
// 創建ExcelPackage對象
using (ExcelPackage package = new ExcelPackage())
{
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("ViolationCarTable");
// 添加標題行
worksheet.Cells["A1"].Value = "違規位置";
worksheet.Cells["B1"].Value = "車牌號碼";
worksheet.Cells["C1"].Value = "違規時間";
// 添加資料
int row = 2;
foreach (var item in violation_car_table)
{
worksheet.Cells["A" + row].Value = item.violation_location_name;
worksheet.Cells["B" + row].Value = item.license_plate_number;
worksheet.Cells["C" + row].Value = item.create_data_time.ToString(); // 可以自行調整日期時間的格式
row++;
}
// 將ExcelPackage保存到內存流中
MemoryStream stream = new MemoryStream(package.GetAsByteArray());
// 設置HttpResponseMessage的內容
Response.Headers.Add("Content-Disposition", "attachment; filename=test.xlsx");
return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
}
}
#endregion
#region EXCEL
/// <summary>
/// 生成指定車輛EXCEL
/// </summary>
/// <returns></returns>
[HttpGet("export-excel_license_plate_number-{id}")]
public async Task<IActionResult> Getlicense_plate_number_excel(string id)
{
var violation_car_table = await (from c in _context.violation_car_table
where c.license_plate_number == id
orderby c.create_data_time descending
select new Single_violation_car_table
{
violation_location_name = c.violation_location_name,
license_plate_number = c.license_plate_number,
create_data_time = c.create_data_time,
}).ToListAsync();
// 創建ExcelPackage對象
using (ExcelPackage package = new ExcelPackage())
{
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("ViolationCarTable");
// 添加標題行
worksheet.Cells["A1"].Value = "違規位置";
worksheet.Cells["B1"].Value = "車牌號碼";
worksheet.Cells["C1"].Value = "違規時間";
// 添加資料
int row = 2;
foreach (var item in violation_car_table)
{
worksheet.Cells["A" + row].Value = item.violation_location_name;
worksheet.Cells["B" + row].Value = item.license_plate_number;
worksheet.Cells["C" + row].Value = item.create_data_time.ToString(); // 可以自行調整日期時間的格式
row++;
}
// 將ExcelPackage保存到內存流中
MemoryStream stream = new MemoryStream(package.GetAsByteArray());
// 設置HttpResponseMessage的內容
Response.Headers.Add("Content-Disposition", "attachment; filename=test.xlsx");
return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
}
}
#endregion
#region EXCEL
/// <summary>
/// 生成指定時間內EXCEL
/// </summary>
/// <returns></returns>
[HttpGet("export-excel_location_name_1_-{id}-start_time-{start_time}-end_time-{end_time}")]
public async Task<IActionResult> Getviolation_car_table_date_excel(string id, DateTime start_time, DateTime end_time)
{
var violation_car_table = await (from c in _context.violation_car_table
where c.violation_location_name == id
where c.create_data_time >= start_time
where c.create_data_time <= end_time
select new Single_violation_car_table
{
violation_location_name = c.violation_location_name,
license_plate_number = c.license_plate_number,
create_data_time = c.create_data_time,
}).ToListAsync();
// 創建ExcelPackage對象
using (ExcelPackage package = new ExcelPackage())
{
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("ViolationCarTable");
// 添加標題行
worksheet.Cells["A1"].Value = "違規位置";
worksheet.Cells["B1"].Value = "車牌號碼";
worksheet.Cells["C1"].Value = "違規時間";
// 添加資料
int row = 2;
foreach (var item in violation_car_table)
{
worksheet.Cells["A" + row].Value = item.violation_location_name;
worksheet.Cells["B" + row].Value = item.license_plate_number;
worksheet.Cells["C" + row].Value = item.create_data_time.ToString(); // 可以自行調整日期時間的格式
row++;
}
// 將ExcelPackage保存到內存流中
MemoryStream stream = new MemoryStream(package.GetAsByteArray());
// 設置HttpResponseMessage的內容
Response.Headers.Add("Content-Disposition", "attachment; filename=test.xlsx");
return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
}
}
#endregion
private bool Violation_car_tableExists(string id)
{
return (_context.violation_car_table?.Any(e => e.violation_location_name == id)).GetValueOrDefault();
}
}
}