From 22b67b344aad0c632b17f1bea4f8103749b861ef Mon Sep 17 00:00:00 2001 From: mahan Date: Thu, 6 Nov 2025 10:02:11 +0330 Subject: [PATCH] feat: update WorkshopEmbedding method and enhance EmployeeFaceEmbedding model with additional properties --- .../EmployeeFaceEmbedding.cs | 14 ++ .../EmployeeFaceEmbeddingRepository.cs | 4 +- .../Pages/Company/AndroidApk/Index.cshtml.cs | 127 ++++++++++++------ .../Camera/Controllers/CameraController.cs | 5 +- 4 files changed, 106 insertions(+), 44 deletions(-) diff --git a/Company.Domain/EmployeeFaceEmbeddingAgg/EmployeeFaceEmbedding.cs b/Company.Domain/EmployeeFaceEmbeddingAgg/EmployeeFaceEmbedding.cs index bef35e88..d38fc151 100644 --- a/Company.Domain/EmployeeFaceEmbeddingAgg/EmployeeFaceEmbedding.cs +++ b/Company.Domain/EmployeeFaceEmbeddingAgg/EmployeeFaceEmbedding.cs @@ -32,17 +32,31 @@ public class EmployeeFaceEmbedding [BsonRepresentation(BsonType.String)] public string Id { get; set; } + [BsonElement("employeeFullName")] public string EmployeeFullName { get; set; } + + [BsonElement("employeeId")] public long EmployeeId { get; set; } + + [BsonElement("workshopId")] public long WorkshopId { get; set; } + [BsonElement("embeddings")] public List Embeddings { get; set; } + + [BsonElement("metadata")] public EmployeeFaceEmbeddingMetadata Metadata { get; set; } + [BsonElement("embeddingHistory")] public List EmbeddingHistory { get; set; } + + [BsonElement("metadataHistory")] public List MetadataHistory { get; set; } + [BsonElement("createdAt")] public DateTime CreatedAt { get; set; } + + [BsonElement("updatedAt")] public DateTime UpdatedAt { get; set; } public void UpdateEmbedding(List newEmbedding, double confidence, double refinementPercentage) diff --git a/CompanyManagement.Infrastructure.Mongo/EmployeeFaceEmbeddingRepo/EmployeeFaceEmbeddingRepository.cs b/CompanyManagement.Infrastructure.Mongo/EmployeeFaceEmbeddingRepo/EmployeeFaceEmbeddingRepository.cs index a12502f2..e2abc255 100644 --- a/CompanyManagement.Infrastructure.Mongo/EmployeeFaceEmbeddingRepo/EmployeeFaceEmbeddingRepository.cs +++ b/CompanyManagement.Infrastructure.Mongo/EmployeeFaceEmbeddingRepo/EmployeeFaceEmbeddingRepository.cs @@ -9,7 +9,7 @@ public class EmployeeFaceEmbeddingRepository : IEmployeeFaceEmbeddingRepository public EmployeeFaceEmbeddingRepository(IMongoDatabase database) { - _employeeFaceEmbeddings = database.GetCollection("EmployeeFaceEmbeddings"); + _employeeFaceEmbeddings = database.GetCollection("EmployeeFaces"); } public async Task CreateAsync(EmployeeFaceEmbedding employeeFaceEmbedding) @@ -48,7 +48,7 @@ public class EmployeeFaceEmbeddingRepository : IEmployeeFaceEmbeddingRepository public async Task> GetByWorkshopIdsAsync(List workshopIds) { return await _employeeFaceEmbeddings - .Find(x => workshopIds.Contains(x.WorkshopId)) + .Find(x => workshopIds.First()==x.WorkshopId) .ToListAsync(); } diff --git a/ServiceHost/Areas/AdminNew/Pages/Company/AndroidApk/Index.cshtml.cs b/ServiceHost/Areas/AdminNew/Pages/Company/AndroidApk/Index.cshtml.cs index dfd8b18f..dbf5c363 100644 --- a/ServiceHost/Areas/AdminNew/Pages/Company/AndroidApk/Index.cshtml.cs +++ b/ServiceHost/Areas/AdminNew/Pages/Company/AndroidApk/Index.cshtml.cs @@ -82,29 +82,76 @@ namespace ServiceHost.Areas.AdminNew.Pages.Company.AndroidApk private async System.Threading.Tasks.Task CreateDadmehrWorkshopFaceEmbedding() { - - // ایجاد HttpClient - var client = new HttpClient(); - - using var formData = new MultipartFormDataContent(); - formData.Add(new StringContent("123"), "employee_id"); - formData.Add(new StringContent("456"), "workshop_id"); - formData.Add(new StringContent("نام کامل کارمند"), "employee_full_name"); - - // ارسال درخواست GET - var response = await client.PostAsync("http://127.0.0.1:8000/embeddings", - formData - ); - - // یا ارسال درخواست POST با داده JSON - // var response = await client.PostAsJsonAsync("https://your-api-url.com/endpoint", new { key = "value" }); - - // بررسی وضعیت پاسخ - if (response.IsSuccessStatusCode) + var basePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "faces", "11"); + + if (!Directory.Exists(basePath)) { - var result = await response.Content.ReadAsStringAsync(); - // یا برای خواندن JSON: var result = await response.Content.ReadFromJsonAsync(); - Console.WriteLine(result); + ViewData["message"] = "مسیر پوشه یافت نشد"; + return; + } + + var directories = Directory.GetDirectories(basePath); + + var client = new HttpClient(); + + foreach (var directory in directories) + { + var directoryName = Path.GetFileName(directory); + + var employee = await _context.Employees + .FirstOrDefaultAsync(x=>x.id == Convert.ToInt64(directoryName)); + var fullname = employee != null ? employee.FullName: "نامشخص"; + + var imageFiles = Directory.GetFiles(directory, "*.*") + .Take(2) + .ToArray(); + + if (imageFiles.Length < 2) + { + Console.WriteLine($"تعداد تصاویر کافی برای {directoryName} وجود ندارد"); + continue; + } + + using var formData = new MultipartFormDataContent(); + formData.Add(new StringContent(directoryName), "employee_id"); + formData.Add(new StringContent("11"), "workshop_id"); + formData.Add(new StringContent(fullname), "employee_full_name"); + + FileStream file1Stream = null; + FileStream file2Stream = null; + + try + { + // ارسال فایل اول + file1Stream = new FileStream(imageFiles[0], FileMode.Open, FileAccess.Read); + var file1Content = new StreamContent(file1Stream); + file1Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/jpeg"); + formData.Add(file1Content, "picture1", Path.GetFileName(imageFiles[0])); + + // ارسال فایل دوم + file2Stream = new FileStream(imageFiles[1], FileMode.Open, FileAccess.Read); + var file2Content = new StreamContent(file2Stream); + file2Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/jpeg"); + formData.Add(file2Content, "picture2", Path.GetFileName(imageFiles[1])); + + var response = await client.PostAsync("http://127.0.0.1:8000/embeddings", formData); + + if (response.IsSuccessStatusCode) + { + var result = await response.Content.ReadAsStringAsync(); + Console.WriteLine($"✓ {directoryName}: {result}"); + } + else + { + var error = await response.Content.ReadAsStringAsync(); + Console.WriteLine($"✗ {directoryName}: {response.StatusCode} - {error}"); + } + } + finally + { + file1Stream?.Dispose(); + file2Stream?.Dispose(); + } } } @@ -724,7 +771,7 @@ namespace ServiceHost.Areas.AdminNew.Pages.Company.AndroidApk //TODO: set data for institution price var workshops = item.contractingParty.Employers .SelectMany(e => e.WorkshopEmployers.Select(we => we.Workshop)).ToList() - .DistinctBy(x=>x.id).ToList(); + .DistinctBy(x => x.id).ToList(); var initialWorkshop = workshops .Select(w => @@ -779,56 +826,56 @@ namespace ServiceHost.Areas.AdminNew.Pages.Company.AndroidApk //var oneMonthSum = current.Sum(x => x.Price); item.contract.SetWorkshopGroup(group); - // var totalPaymentAndWorkshopList = await _clientRegistrationApplication.GetTotalPaymentAndWorkshopList(oneMonthSum,duration: InstitutionContractDuration.TwelveMonths,false); - // item.contract.SetAmount(totalPaymentAndWorkshopList.OneTimeTotalPaymentStr.MoneyToDouble(), - // totalPaymentAndWorkshopList.OneTimeValueAddedTaxStr.MoneyToDouble(),totalPaymentAndWorkshopList.DiscountedAmountForOneMonth.MoneyToDouble()); + // var totalPaymentAndWorkshopList = await _clientRegistrationApplication.GetTotalPaymentAndWorkshopList(oneMonthSum,duration: InstitutionContractDuration.TwelveMonths,false); + // item.contract.SetAmount(totalPaymentAndWorkshopList.OneTimeTotalPaymentStr.MoneyToDouble(), + // totalPaymentAndWorkshopList.OneTimeValueAddedTaxStr.MoneyToDouble(),totalPaymentAndWorkshopList.DiscountedAmountForOneMonth.MoneyToDouble()); } var remoteIds = remoteContractsQuery.Select(x => x.contract.id); - var inPersonContracts =await query - .Where(x=>!remoteIds.Contains(x.contractingParty.id)).ToListAsync(); + var inPersonContracts = await query + .Where(x => !remoteIds.Contains(x.contractingParty.id)).ToListAsync(); foreach (var item in inPersonContracts) { var workshops = item.contractingParty.Employers .SelectMany(e => e.WorkshopEmployers.Select(we => we.Workshop)).ToList() - .DistinctBy(x=>x.id).ToList(); + .DistinctBy(x => x.id).ToList(); var initialWorkshop = workshops .Select(w => { var personnelCount = w.LeftWorks.Count(lw => lw.StartWorkDate <= today && lw.LeftWorkDate >= today); - + bool hasRollCallPlan = true; bool hasRollCallPlanInPerson = false; bool hasCustomizeCheckoutPlan = w.id == 170; bool hasContractPlan = true; bool hasContractPlanInPerson = true; - bool hasInsurancePlan =true; + bool hasInsurancePlan = true; bool hasInsurancePlanInPerson = true; - - var initial = InstitutionContractWorkshopInitial.CreateManual(w.WorkshopFullName, hasRollCallPlan, - hasRollCallPlanInPerson,hasCustomizeCheckoutPlan, - hasContractPlan,hasContractPlanInPerson, - hasInsurancePlan,hasInsurancePlanInPerson,personnelCount,0, + + var initial = InstitutionContractWorkshopInitial.CreateManual(w.WorkshopFullName, + hasRollCallPlan, + hasRollCallPlanInPerson, hasCustomizeCheckoutPlan, + hasContractPlan, hasContractPlanInPerson, + hasInsurancePlan, hasInsurancePlanInPerson, personnelCount, 0, w.id, w.WorkshopEmployers.Select(x => x.EmployerId ).ToList()); return initial; }).ToList(); var group = new InstitutionContractWorkshopGroup(item.contract.id, initialWorkshop); - + await _context.AddAsync(group); await _context.SaveChangesAsync(); - + initialWorkshop.ForEach(x => { var workshopId = workshops.First(w => x.WorkshopId.Value == w.id).id; x.SetWorkshopId(workshopId); }); - + item.contract.SetWorkshopGroup(group); - } await _context.SaveChangesAsync(); diff --git a/ServiceHost/Areas/Camera/Controllers/CameraController.cs b/ServiceHost/Areas/Camera/Controllers/CameraController.cs index 3bd378f9..ec83fcad 100644 --- a/ServiceHost/Areas/Camera/Controllers/CameraController.cs +++ b/ServiceHost/Areas/Camera/Controllers/CameraController.cs @@ -71,15 +71,16 @@ public class CameraController : CameraBaseController [HttpPost("embedding")] [AllowAnonymous] - public async Task>> WorkshopEmbedding([FromBody] long[] workshopIds) + public async Task>> WorkshopEmbedding() { if (!User.Identity?.IsAuthenticated ?? false) { return Unauthorized(); } + var workshopIds = _authHelper.GetWorkshopId(); var data = await _employeeFaceEmbeddingApplication - .GetByWorkshopIdsAsync(workshopIds.ToList()); + .GetByWorkshopIdsAsync([workshopIds]); return data; }