171 lines
5.9 KiB
C#
171 lines
5.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using Company.Domain.EmployeeFaceEmbeddingAgg;
|
|
using CompanyManagment.App.Contracts.EmployeeFaceEmbedding;
|
|
|
|
namespace CompanyManagment.Application;
|
|
|
|
public class EmployeeFaceEmbeddingApplication : IEmployeeFaceEmbeddingApplication
|
|
{
|
|
private readonly IEmployeeFaceEmbeddingRepository _repository;
|
|
|
|
public EmployeeFaceEmbeddingApplication(IEmployeeFaceEmbeddingRepository repository)
|
|
{
|
|
_repository = repository;
|
|
}
|
|
|
|
public async Task<EmployeeFaceEmbeddingDto> GetByIdAsync(string id)
|
|
{
|
|
var entity = await _repository.GetByIdAsync(id);
|
|
return entity == null ? null : MapToDto(entity);
|
|
}
|
|
|
|
public async Task<EmployeeFaceEmbeddingDto> GetByEmployeeIdAsync(long employeeId)
|
|
{
|
|
var entity = await _repository.GetByEmployeeIdAsync(employeeId);
|
|
return entity == null ? null : MapToDto(entity);
|
|
}
|
|
|
|
public async Task<List<EmployeeFaceEmbeddingDto>> GetByWorkshopIdAsync(long workshopId)
|
|
{
|
|
var entities = await _repository.GetByWorkshopIdAsync(workshopId);
|
|
return entities.Select(MapToDto).ToList();
|
|
}
|
|
|
|
public async Task<List<EmployeeFaceEmbeddingDto>> GetByWorkshopIdsAsync(List<long> workshopIds)
|
|
{
|
|
var entities = await _repository.GetByWorkshopIdsAsync(workshopIds);
|
|
return entities.Select(MapToDto).ToList();
|
|
}
|
|
|
|
public async Task<string> SaveAsync(EmployeeFaceEmbeddingDto dto)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(dto.Id))
|
|
{
|
|
// ایجاد جدید
|
|
var metadata = MapMetadataFromDto(dto.Metadata);
|
|
var entity = new EmployeeFaceEmbedding(
|
|
dto.EmployeeFullName,
|
|
dto.EmployeeId,
|
|
dto.WorkshopId,
|
|
dto.Embeddings,
|
|
metadata
|
|
);
|
|
|
|
await _repository.CreateAsync(entity);
|
|
return entity.Id;
|
|
}
|
|
else
|
|
{
|
|
// بهروزرسانی
|
|
var entity = await _repository.GetByIdAsync(dto.Id);
|
|
if (entity == null)
|
|
throw new Exception($"EmployeeFaceEmbedding با شناسه {dto.Id} یافت نشد");
|
|
|
|
entity.UpdateEmployeeInfo(dto.EmployeeFullName, dto.WorkshopId);
|
|
entity.UpdateEmbedding(dto.Embeddings, 0, 0);
|
|
entity.UpdateMetadata(MapMetadataFromDto(dto.Metadata), 0, 0);
|
|
|
|
await _repository.UpdateAsync(entity);
|
|
return entity.Id;
|
|
}
|
|
}
|
|
|
|
public async Task DeleteAsync(string id)
|
|
{
|
|
await _repository.DeleteAsync(id);
|
|
}
|
|
|
|
#region Mapping Methods
|
|
|
|
private EmployeeFaceEmbeddingDto MapToDto(EmployeeFaceEmbedding entity)
|
|
{
|
|
return new EmployeeFaceEmbeddingDto
|
|
{
|
|
Id = entity.Id,
|
|
EmployeeFullName = entity.EmployeeFullName,
|
|
EmployeeId = entity.EmployeeId,
|
|
WorkshopId = entity.WorkshopId,
|
|
Embeddings = entity.Embeddings,
|
|
Metadata = MapMetadataToDto(entity.Metadata)
|
|
};
|
|
}
|
|
|
|
private EmployeeFaceEmbeddingMetadataDto MapMetadataToDto(EmployeeFaceEmbeddingMetadata metadata)
|
|
{
|
|
if (metadata == null) return null;
|
|
|
|
return new EmployeeFaceEmbeddingMetadataDto
|
|
{
|
|
AvgEyeDistanceNormalized = metadata.AvgEyeDistanceNormalized,
|
|
AvgEyeToFaceRatio = metadata.AvgEyeToFaceRatio,
|
|
AvgFaceAspectRatio = metadata.AvgFaceAspectRatio,
|
|
AvgDetectionConfidence = metadata.AvgDetectionConfidence,
|
|
AvgKeypointsNormalized = MapKeypointsToDto(metadata.AvgKeypointsNormalized),
|
|
PerImageMetadata = metadata.PerImageMetadata?.Select(x => new ImageMetadataDto
|
|
{
|
|
FaceAspectRatio = x.FaceAspectRatio,
|
|
EyeDistanceNormalized = x.EyeDistanceNormalized,
|
|
EyeToFaceRatio = x.EyeToFaceRatio,
|
|
DetectionConfidence = x.DetectionConfidence,
|
|
KeypointsNormalized = MapKeypointsToDto(x.KeypointsNormalized)
|
|
}).ToList()
|
|
};
|
|
}
|
|
|
|
private EmployeeFaceEmbeddingKeypointsDto MapKeypointsToDto(EmployeeFaceEmbeddingKeypoints keypoints)
|
|
{
|
|
if (keypoints == null) return null;
|
|
|
|
return new EmployeeFaceEmbeddingKeypointsDto
|
|
{
|
|
LeftEye = keypoints.LeftEye,
|
|
RightEye = keypoints.RightEye,
|
|
Nose = keypoints.Nose,
|
|
MouthLeft = keypoints.MouthLeft,
|
|
MouthRight = keypoints.MouthRight
|
|
};
|
|
}
|
|
|
|
private EmployeeFaceEmbeddingMetadata MapMetadataFromDto(EmployeeFaceEmbeddingMetadataDto dto)
|
|
{
|
|
if (dto == null) return null;
|
|
|
|
return new EmployeeFaceEmbeddingMetadata
|
|
{
|
|
AvgEyeDistanceNormalized = dto.AvgEyeDistanceNormalized,
|
|
AvgEyeToFaceRatio = dto.AvgEyeToFaceRatio,
|
|
AvgFaceAspectRatio = dto.AvgFaceAspectRatio,
|
|
AvgDetectionConfidence = dto.AvgDetectionConfidence,
|
|
AvgKeypointsNormalized = MapKeypointsFromDto(dto.AvgKeypointsNormalized),
|
|
PerImageMetadata = dto.PerImageMetadata?.Select(x => new ImageMetadata
|
|
{
|
|
FaceAspectRatio = x.FaceAspectRatio,
|
|
EyeDistanceNormalized = x.EyeDistanceNormalized,
|
|
EyeToFaceRatio = x.EyeToFaceRatio,
|
|
DetectionConfidence = x.DetectionConfidence,
|
|
KeypointsNormalized = MapKeypointsFromDto(x.KeypointsNormalized)
|
|
}).ToList()
|
|
};
|
|
}
|
|
|
|
private EmployeeFaceEmbeddingKeypoints MapKeypointsFromDto(EmployeeFaceEmbeddingKeypointsDto dto)
|
|
{
|
|
if (dto == null) return null;
|
|
|
|
return new EmployeeFaceEmbeddingKeypoints
|
|
{
|
|
LeftEye = dto.LeftEye,
|
|
RightEye = dto.RightEye,
|
|
Nose = dto.Nose,
|
|
MouthLeft = dto.MouthLeft,
|
|
MouthRight = dto.MouthRight
|
|
};
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
|