feat: update WorkshopEmbedding method and enhance EmployeeFaceEmbedding model with additional properties

This commit is contained in:
2025-11-06 10:02:11 +03:30
parent f4853b6f39
commit 22b67b344a
4 changed files with 106 additions and 44 deletions

View File

@@ -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<double> Embeddings { get; set; }
[BsonElement("metadata")]
public EmployeeFaceEmbeddingMetadata Metadata { get; set; }
[BsonElement("embeddingHistory")]
public List<EmbeddingHistoryItem> EmbeddingHistory { get; set; }
[BsonElement("metadataHistory")]
public List<MetadataHistoryItem> MetadataHistory { get; set; }
[BsonElement("createdAt")]
public DateTime CreatedAt { get; set; }
[BsonElement("updatedAt")]
public DateTime UpdatedAt { get; set; }
public void UpdateEmbedding(List<double> newEmbedding, double confidence, double refinementPercentage)

View File

@@ -9,7 +9,7 @@ public class EmployeeFaceEmbeddingRepository : IEmployeeFaceEmbeddingRepository
public EmployeeFaceEmbeddingRepository(IMongoDatabase database)
{
_employeeFaceEmbeddings = database.GetCollection<EmployeeFaceEmbedding>("EmployeeFaceEmbeddings");
_employeeFaceEmbeddings = database.GetCollection<EmployeeFaceEmbedding>("EmployeeFaces");
}
public async Task CreateAsync(EmployeeFaceEmbedding employeeFaceEmbedding)
@@ -48,7 +48,7 @@ public class EmployeeFaceEmbeddingRepository : IEmployeeFaceEmbeddingRepository
public async Task<List<EmployeeFaceEmbedding>> GetByWorkshopIdsAsync(List<long> workshopIds)
{
return await _employeeFaceEmbeddings
.Find(x => workshopIds.Contains(x.WorkshopId))
.Find(x => workshopIds.First()==x.WorkshopId)
.ToListAsync();
}

View File

@@ -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<YourType>();
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();

View File

@@ -71,15 +71,16 @@ public class CameraController : CameraBaseController
[HttpPost("embedding")]
[AllowAnonymous]
public async Task<ActionResult<List<EmployeeFaceEmbeddingDto>>> WorkshopEmbedding([FromBody] long[] workshopIds)
public async Task<ActionResult<List<EmployeeFaceEmbeddingDto>>> WorkshopEmbedding()
{
if (!User.Identity?.IsAuthenticated ?? false)
{
return Unauthorized();
}
var workshopIds = _authHelper.GetWorkshopId();
var data = await _employeeFaceEmbeddingApplication
.GetByWorkshopIdsAsync(workshopIds.ToList());
.GetByWorkshopIdsAsync([workshopIds]);
return data;
}