feat: enhance CameraController with refined roll call enter/exit endpoints and HTTP client integration

This commit is contained in:
2025-11-08 12:17:34 +03:30
parent 5c7dd76e3f
commit 59284ffd29
2 changed files with 93 additions and 73 deletions

View File

@@ -34,6 +34,8 @@ public class CameraController : CameraBaseController
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,
@@ -46,7 +48,7 @@ public class CameraController : CameraBaseController
IAccountApplication accountApplication,
IPasswordHasher passwordHasher,
ICameraAccountApplication cameraAccountApplication,
IEmployeeFaceEmbeddingApplication employeeFaceEmbeddingApplication)
IEmployeeFaceEmbeddingApplication employeeFaceEmbeddingApplication, IHttpClientFactory httpClientFactory)
{
_webHostEnvironment = webHostEnvironment;
_configuration = configuration;
@@ -60,7 +62,11 @@ public class CameraController : CameraBaseController
_passwordHasher = passwordHasher;
_cameraAccountApplication = cameraAccountApplication;
_employeeFaceEmbeddingApplication = employeeFaceEmbeddingApplication;
_httpClientFactory = httpClientFactory;
_faceEmbeddingHttpClient = httpClientFactory.CreateClient();
_faceEmbeddingHttpClient.BaseAddress = new Uri("http://localhost:8000/");
_workshopId= authHelper.GetWorkshopId();
}
[HttpPost("login")]
@@ -98,10 +104,44 @@ public class CameraController : CameraBaseController
});
}
[HttpPost("exit/{flagId:long}")]
public IActionResult Exit(long flagId)
[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
@@ -113,16 +153,50 @@ public class CameraController : CameraBaseController
throw new BadRequestException(res.Message);
}
[HttpPost("enter/{employeeId:long}")]
public IActionResult Enter(long employeeId)
[HttpPost("enter")]
public IActionResult Enter([FromBody]RollCallEnterRequest request)
{
var employeeId = request.EmployeeId;
var now = DateTime.Now;
var command = new CreateRollCall()
{
WorkshopId = _workshopId,
EmployeeId = employeeId,
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)
{
@@ -203,72 +277,7 @@ public class CameraController : CameraBaseController
flag = flagId
});
}
[HttpGet("ShowPicture")]
public IActionResult ShowPicture(int index, long workshopId, long label)
{
var filePath = Path.Combine(_webHostEnvironment.ContentRootPath, "Faces", workshopId.ToString(),
label.ToString(), $"{index}.jpg");
if (!System.IO.File.Exists(filePath))
{
return NotFound();
}
var contentType = "image/jpeg";
return PhysicalFile(filePath, contentType);
}
[HttpGet("PersonnelWorkshopAjax")]
public IActionResult PersonnelWorkshopAjax()
{
var cameraAccount = _authHelper.CameraAccountInfo();
if (cameraAccount.WorkshopId > 0)
{
var result = _rollCallEmployeeApplication.GetActivePersonnelByWorkshopId(cameraAccount.WorkshopId);
if (cameraAccount.WorkshopId == 170)
result = result.Select(x =>
{
if (x.PersonelCode == 477)
x.EmployeeLName = "نوزاد";
return x;
}).ToList();
return new JsonResult(result);
}
else
{
return new JsonResult(new
{
isSuccess = false,
message = "کارگاه ای یافت نشد!"
});
}
}
[HttpPost("CheckPassword")]
public IActionResult CheckPassword([FromForm] string password)
{
var cameraAccount = _authHelper.CameraAccountInfo();
var cameraPassword = _cameraAccountApplication.GetDetails(cameraAccount.Id).Password;
(bool Verified, bool NeedUpgrade) result = _passwordHasher.Check(cameraPassword, password);
if (result.Verified)
{
_accountApplication.Logout();
return new JsonResult(new
{
isSuccess = true,
});
}
return new JsonResult(new
{
isSuccess = false,
errorMessage = "گذرواژه اشتباه است",
});
}
[HttpGet("Logout")]
public IActionResult Logout()
@@ -278,6 +287,17 @@ public class CameraController : CameraBaseController
}
}
public class RollCallExitRequest:RollCallEnterRequest
{
public long FlagId { get; set; }
}
public class RollCallEnterRequest
{
public long EmployeeId { get; set; }
public List<double> Embeddings { get; set; }
public float Confidence { get; set; }
}
public class CameraFlagRequest
{
public long EmployeeId { get; set; }

View File

@@ -19,7 +19,7 @@
"sqlDebugging": true,
"dotnetRunMessages": "true",
"nativeDebugging": true,
"applicationUrl": "https://localhost:5004;http://localhost:5003;https://192.168.28.36:8080;http://192.168.28.36:8081",
"applicationUrl": "https://localhost:5004;http://localhost:5003;https://192.168.0.117:8080;http://192.168.0.117:8081",
"jsWebView2Debugging": false,
"hotReloadEnabled": true
},