feat: add InstitutionContractWorkshopDetail and related mappings for workshop management

This commit is contained in:
MahanCh
2025-08-21 11:05:26 +03:30
parent 6869ccb436
commit 362b306c48
7 changed files with 129 additions and 30 deletions

View File

@@ -192,6 +192,7 @@ public class InstitutionContractWorkshopDetail:EntityBase
PersonnelCount = personnelCount;
WorkshopCreated = false;
Price = price;
Employers = [];
}
/// <summary>
@@ -228,11 +229,34 @@ public class InstitutionContractWorkshopDetail:EntityBase
/// </summary>
public long InstitutionContractId { get; private set; }
/// <summary>
/// Navigation property to InstitutionContract
/// </summary>
public InstitutionContract InstitutionContract { get; private set; }
public double Price { get; set; }
private InstitutionContractWorkshopDetail()
{
}
public List<InstitutionContractWorkshopDetailEmployer> Employers { get; private set; } = new();
public void SetEmployers(List<long> employerIds)
{
Employers.Clear();
foreach (var employerId in employerIds)
{
Employers.Add(new InstitutionContractWorkshopDetailEmployer(id, employerId));
}
}
public void AddEmployer(long employerId)
{
if (Employers.Exists(x => x.EmployerId == employerId))
return;
Employers.Add(new InstitutionContractWorkshopDetailEmployer(id, employerId));
}
public void Edit(bool hasAttendancePlan, bool hasUnofficialPayslipPlan, bool hasContractSettlementPlan)
{
@@ -281,4 +305,17 @@ public class InstitutionContractInstallment
public long InstitutionContractId { get; private set; }
public InstitutionContract InstitutionContract { get; private set; }
}
public class InstitutionContractWorkshopDetailEmployer : EntityBase
{
public long InstitutionContractWorkshopDetailId { get; private set; }
public long EmployerId { get; private set; }
public InstitutionContractWorkshopDetailEmployer(long institutionContractWorkshopDetailId, long employerId)
{
InstitutionContractWorkshopDetailId = institutionContractWorkshopDetailId;
EmployerId = employerId;
}
private InstitutionContractWorkshopDetailEmployer() { }
}

View File

@@ -69,8 +69,6 @@ public class CreateInstitutionContractTemp
/// </summary>
public InstitutionContractTempStatus RegistrationStatus { get; set; }
/// <summary>
/// آی دی پیامک ارسال شده
/// </summary>

View File

@@ -271,6 +271,7 @@ public class CompanyContext : DbContext
public DbSet<InsuranceJobAndJobs> InsuranceJobAndJobsSet { get; set; }
public DbSet<InstitutionContractContactInfo> InstitutionContractContactInfos { get; set; }
public DbSet<InstitutionContract> InstitutionContractSet { get; set; }
public DbSet<InstitutionContractWorkshopDetail> InstitutionContractWorkshopDetails { get; set; }
public DbSet<FileEmployer> FileEmployerSet { get; set; }
public DbSet<FileEmployee> FileEmployeeSet { get; set; }
public DbSet<Representative> RepresentativeSet { get; set; }

View File

@@ -30,13 +30,11 @@ public class InstitutionContractMapping : IEntityTypeConfiguration<InstitutionCo
builder.Property(x => x.HasValueAddedTax).HasMaxLength(10);
builder.Property(x => x.Status).HasConversion<string>().HasMaxLength(122);
builder.OwnsMany(x => x.WorkshopDetails, workshopDetail =>
{
workshopDetail.HasKey(x => x.id);
workshopDetail.WithOwner().HasForeignKey(x => x.InstitutionContractId);
workshopDetail.Property(x => x.WorkshopName).HasMaxLength(100);
workshopDetail.Property(x => x.WorkshopId).IsRequired(false);
});
// Configure simple relationship with WorkshopDetails for Include() support
builder.HasMany(x => x.WorkshopDetails)
.WithOne(x => x.InstitutionContract)
.HasForeignKey(x => x.InstitutionContractId);
builder.HasMany(x => x.Installments)
.WithOne(x => x.InstitutionContract)

View File

@@ -0,0 +1,33 @@
using Company.Domain.InstitutionContractAgg;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace CompanyManagment.EFCore.Mapping;
public class InstitutionContractWorkshopDetailMapping : IEntityTypeConfiguration<InstitutionContractWorkshopDetail>
{
public void Configure(EntityTypeBuilder<InstitutionContractWorkshopDetail> builder)
{
builder.ToTable("InstitutionContractWorkshopDetail");
builder.HasKey(x => x.id);
builder.Property(x => x.WorkshopName).HasMaxLength(100);
builder.Property(x => x.WorkshopId).IsRequired(false);
// Configure relationship with InstitutionContract
builder.HasOne(x => x.InstitutionContract)
.WithMany(x => x.WorkshopDetails)
.HasForeignKey(x => x.InstitutionContractId);
// Configure OwnsMany relationship with Employers
builder.OwnsMany(x => x.Employers, employer =>
{
employer.ToTable("InstitutionContractWorkshopDetailEmployers");
employer.HasKey(x => x.id);
employer.WithOwner().HasForeignKey(x => x.InstitutionContractWorkshopDetailId);
employer.Property(x => x.EmployerId).IsRequired();
employer.HasIndex(x => new { x.InstitutionContractWorkshopDetailId, x.EmployerId })
.IsUnique();
});
}
}

View File

@@ -43,9 +43,7 @@ partial class WorkshopMapping : IEntityTypeConfiguration<Workshop>
builder.Property(x => x.CutContractEndOfYear).HasConversion(x => x.ToString()
, x => ((IsActive)Enum.Parse(typeof(IsActive), x))).HasMaxLength(5);
builder.Property(x => x.RegistrationStatus).HasConversion<string>().HasMaxLength(50);
builder.HasQueryFilter(x => x.RegistrationStatus == WorkshopRegistrationStatus.Registered);
//builder.HasOne(x => x.Employer)
// .WithMany(x => x.Workshops)

View File

@@ -1416,39 +1416,72 @@ public class InstitutionContractRepository : RepositoryBase<long, InstitutionCon
}).ToListAsync();
}
/// <summary>
/// دریافت لیست اقلام گردش کار ثبت نام
/// </summary>
/// <param name="institutionContractId">شناسه قرارداد نهاد</param>
/// <returns>لیست اقلام گردش کار ثبت نام</returns>
public async Task<List<RegistrationWorkflowItemsViewModel>> RegistrationWorkflowItems(long institutionContractId)
{
// دریافت قرارداد نهاد همراه با جزئیات کارگاه‌ها
var institutionContract = await _context.InstitutionContractSet
.Include(x => x.WorkshopDetails)
.FirstOrDefaultAsync(x => x.id == institutionContractId);
if (institutionContract == null)
throw new NotFoundException("قرارداد مؤسسه یافت نشد");
// استخراج شناسه‌های کارگاه‌هایی که ایجاد شده‌اند
var workshopIds = institutionContract.WorkshopDetails
.Where(x => x.WorkshopId != null)
.Select(x => x.WorkshopId.Value)
.ToList();
var workshopIds = institutionContract.WorkshopDetails.Where(x => x.WorkshopId != null)
.Select(x => x.WorkshopId.Value).ToList();
// دریافت کارگاه‌ها همراه با کارفرمایان در یک کوئری
var workshopsTask = _context.Workshops
.Where(x => workshopIds.Contains(x.id)).ToListAsync();
var workshops = await _context.Workshops.IgnoreQueryFilters()
.Where(x => workshopIds.Contains(x.id))
.Include(workshop => workshop.WorkshopEmployers)
.ThenInclude(workshopEmployer => workshopEmployer.Employer)
// استخراج تمامی شناسه‌های کارفرمایان از جزئیات کارگاه‌ها
var allEmployerIds = institutionContract.WorkshopDetails
.SelectMany(x => x.Employers.Select(e => e.EmployerId))
.Distinct()
.ToList();
// دریافت اطلاعات کارفرمایان در یک کوئری واحد
var employersTask = _context.Employers
.Where(e => allEmployerIds.Contains(e.id))
.Select(e => new { e.id, e.FullName })
.ToListAsync();
var items = institutionContract.WorkshopDetails.Select(x =>
// انتظار برای تکمیل هر دو کوئری به صورت موازی
await Task.WhenAll(workshopsTask, employersTask);
var workshops = await workshopsTask;
var employersDict = (await employersTask).ToDictionary(e => e.id, e => e);
// ساخت نتیجه نهایی با استفاده از داده‌های از پیش بارگذاری شده
var items = institutionContract.WorkshopDetails.Select(workshopDetail =>
{
var workshop = workshops.FirstOrDefault(w => w.id == x.WorkshopId);
// پیدا کردن کارگاه مرتبط
var workshop = workshops.FirstOrDefault(w => w.id == workshopDetail.WorkshopId);
// ساخت لیست کارفرمایان این جزئیات کارگاه
var employers = workshopDetail.Employers
.Where(e => employersDict.ContainsKey(e.EmployerId))
.Select(e => new RegistrationWorkflowItemsEmployerViewModel
{
Id = e.EmployerId,
FullName = employersDict[e.EmployerId].FullName
})
.ToList();
return new RegistrationWorkflowItemsViewModel
{
Price = x.Price,
Price = workshopDetail.Price,
IsDone = workshop != null,
PersonnelCount = x.PersonnelCount,
WorkshopName = x.WorkshopName,
Employers = workshop?.WorkshopEmployers.Select(we => we.Employer).Select(we =>
new RegistrationWorkflowItemsEmployerViewModel
{
Id = x.id,
FullName = we.FullName,
}).ToList() ?? [],
PersonnelCount = workshopDetail.PersonnelCount,
WorkshopName = workshopDetail.WorkshopName,
Employers = employers,
};
}).ToList();
@@ -1523,4 +1556,5 @@ public class InstitutionContractRepository : RepositoryBase<long, InstitutionCon
}
#endregion
}
}