using ServiceHost.BaseControllers; using System; using System.IO; using System.Linq; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Hosting; using _0_Framework.Application; using _0_Framework.Exceptions; using AccountManagement.Application.Contracts.Account; using AccountManagement.Application.Contracts.CameraAccount; using AccountManagement.Domain.TaskAgg; using CompanyManagment.App.Contracts.PersonnleCode; using CompanyManagment.App.Contracts.RollCall; using CompanyManagment.App.Contracts.RollCallEmployee; using CompanyManagment.App.Contracts.RollCallService; using CompanyManagment.App.Contracts.Employee; using CompanyManagment.App.Contracts.EmployeeFaceEmbedding; using Microsoft.AspNetCore.Authorization; namespace ServiceHost.Areas.Camera.Controllers; public class CameraController : CameraBaseController { private readonly IWebHostEnvironment _webHostEnvironment; private readonly IConfiguration _configuration; private readonly IEmployeeApplication _employeeApplication; private readonly IRollCallApplication _rollCallApplication; private readonly IRollCallServiceApplication _rollCallServiceApplication; private readonly IRollCallEmployeeApplication _rollCallEmployeeApplication; private readonly IAuthHelper _authHelper; private readonly IPersonnelCodeApplication _personnelCodeApplication; private readonly IAccountApplication _accountApplication; private readonly IPasswordHasher _passwordHasher; private readonly ICameraAccountApplication _cameraAccountApplication; private readonly IEmployeeFaceEmbeddingApplication _employeeFaceEmbeddingApplication; private long _workshopId; private readonly IHttpClientFactory _httpClientFactory; private readonly HttpClient _faceEmbeddingHttpClient; public CameraController(IWebHostEnvironment webHostEnvironment, IConfiguration configuration, IEmployeeApplication employeeApplication, IRollCallApplication rollCallApplication, IAuthHelper authHelper, IRollCallServiceApplication rollCallServiceApplication, IRollCallEmployeeApplication rollCallEmployeeApplication, IPersonnelCodeApplication personnelCodeApplication, IAccountApplication accountApplication, IPasswordHasher passwordHasher, ICameraAccountApplication cameraAccountApplication, IEmployeeFaceEmbeddingApplication employeeFaceEmbeddingApplication, IHttpClientFactory httpClientFactory) { _webHostEnvironment = webHostEnvironment; _configuration = configuration; _employeeApplication = employeeApplication; _rollCallApplication = rollCallApplication; _authHelper = authHelper; _rollCallServiceApplication = rollCallServiceApplication; _rollCallEmployeeApplication = rollCallEmployeeApplication; _personnelCodeApplication = personnelCodeApplication; _accountApplication = accountApplication; _passwordHasher = passwordHasher; _cameraAccountApplication = cameraAccountApplication; _employeeFaceEmbeddingApplication = employeeFaceEmbeddingApplication; _httpClientFactory = httpClientFactory; _faceEmbeddingHttpClient = httpClientFactory.CreateClient(); _faceEmbeddingHttpClient.BaseAddress = new Uri("http://localhost:8000/"); _workshopId= authHelper.GetWorkshopId(); } [HttpPost("login")] [AllowAnonymous] public IActionResult CameraLogin([FromBody] CameraLoginRequest request) { _accountApplication.CameraLogin(request); return Ok(new { WorkshopId = _workshopId, }); } [HttpPost("embedding")] [AllowAnonymous] public async Task>> WorkshopEmbedding() { if (!User.Identity?.IsAuthenticated ?? false) { return Unauthorized(); } _workshopId = _authHelper.GetWorkshopId(); var data = await _employeeFaceEmbeddingApplication .GetByWorkshopIdsAsync([_workshopId]); return data; } [HttpPost("flag/{employeeId:long}")] public async Task GetFlag(long employeeId) { var flagId = _rollCallApplication.Flag(employeeId, _workshopId); return Ok(new { flagId = flagId, status = flagId == 0 ? "enter": "exit" }); } [HttpPost("exit")] public IActionResult Exit([FromBody]RollCallExitRequest request) { var employeeId = request.EmployeeId; var flagId = request.FlagId; bool rollCallEmployee = _rollCallEmployeeApplication.IsEmployeeRollCallActive(employeeId, _workshopId); if (!rollCallEmployee) { throw new BadRequestException("پرسنل مورد نظر غیر فعال است"); } _faceEmbeddingHttpClient.PostAsync("embeddings/refine", JsonContent.Create(new { employeeId, workshopId = _workshopId, embedding =request.Embeddings , confidence =request.Confidence , metadata =new{}, })); var repeatStatus = _rollCallApplication.CheckRepeat(employeeId, _workshopId); switch (repeatStatus) { case "IncomRegistred-InvalidOut": throw new BadRequestException("شما به تازگی ثبت ورود نموده اید ,تا 2 دقیقه نمی توانید ثبت خروج نمایید"); case "outRegistred-InvalidIncom": throw new BadRequestException("شما به تازگی ثبت خروج نموده اید تا 2 دقیقه نمی توانید ثبت ورود نمایید"); } var res = _rollCallApplication.Edit(flagId); if (res.IsSuccedded) { return new JsonResult(new { isSuccess = true, }); } throw new BadRequestException(res.Message); } [HttpPost("enter")] public IActionResult Enter([FromBody]RollCallEnterRequest request) { var employeeId = request.EmployeeId; var now = DateTime.Now; var command = new CreateRollCall() { WorkshopId = _workshopId, EmployeeId = request.EmployeeId, StartDate = now, }; bool rollCallEmployee = _rollCallEmployeeApplication.IsEmployeeRollCallActive(employeeId, _workshopId); if (!rollCallEmployee) { throw new BadRequestException("پرسنل مورد نظر غیر فعال است"); } _faceEmbeddingHttpClient.PostAsync("embeddings/refine", JsonContent.Create(new { employeeId, workshopId = _workshopId, embedding =request.Embeddings , confidence =request.Confidence , metadata =new{}, })); var repeatStatus = _rollCallApplication.CheckRepeat(employeeId, _workshopId); switch (repeatStatus) { case "IncomRegistred-InvalidOut": throw new BadRequestException("شما به تازگی ثبت ورود نموده اید ,تا 2 دقیقه نمی توانید ثبت خروج نمایید"); case "outRegistred-InvalidIncom": throw new BadRequestException("شما به تازگی ثبت خروج نموده اید تا 2 دقیقه نمی توانید ثبت ورود نمایید"); } var res = _rollCallApplication.Create(command); if (res.IsSuccedded) { return new JsonResult(new { isSuccess = true, }); } else { return new JsonResult(new { isSuccess = false, }); } } [HttpGet("SendPersonelCodeToGetEmployeeId")] public IActionResult SendPersonelCodeToGetEmployeeId(long personelCode, long workshopId) { long employeeId = _personnelCodeApplication.GetEmployeeIdByPersonelCode(personelCode, workshopId); if (employeeId == 0) { return new JsonResult(new { isSuccess = false, message = "کد پرسنلی یافت نشد", }); } bool rollcallEmployee = _rollCallEmployeeApplication.IsEmployeeRollCallActive(employeeId, workshopId); if (!rollcallEmployee) { return new JsonResult(new { isSuccess = false, message = "پرسنل مورد نظر غیر فعال است", }); } var repeatStatus = _rollCallApplication.CheckRepeat(employeeId, workshopId); switch (repeatStatus) { case "IncomRegistred-InvalidOut": return new JsonResult(new { isSuccess = false, message = "شما به تازگی ثبت ورود نموده اید ,تا 2 دقیقه نمی توانید ثبت خروج نمایید", }); case "outRegistred-InvalidIncom": return new JsonResult(new { isSuccess = false, message = "شما به تازگی ثبت خروج نموده اید تا 2 دقیقه نمی توانید ثبت ورود نمایید", }); } return new JsonResult(new { isSuccess = true, message = "", personId = $"{employeeId}", }); } [HttpGet("EmployeeFlag")] public IActionResult EmployeeFlag(long employeeId, long workshopId) { var employee = _rollCallEmployeeApplication.GetByEmployeeIdAndWorkshopId(employeeId, workshopId); var employeeFullName = employee?.EmployeeFullName ?? string.Empty; var flagId = _rollCallApplication.Flag(employeeId, workshopId); return new JsonResult(new { employeeName = employeeFullName, flag = flagId }); } [HttpGet("Logout")] public IActionResult Logout() { _accountApplication.Logout(); return new JsonResult(new { isSuccess = true }); } } public class RollCallExitRequest:RollCallEnterRequest { public long FlagId { get; set; } } public class RollCallEnterRequest { public long EmployeeId { get; set; } public List Embeddings { get; set; } public float Confidence { get; set; } } public class CameraFlagRequest { public long EmployeeId { get; set; } public long WorkshopId { get; set; } }