From 3a6e115f7301f24816ff060d3eca81b67c80a6f8 Mon Sep 17 00:00:00 2001 From: mahan Date: Thu, 29 Jan 2026 11:29:03 +0330 Subject: [PATCH] init --- Company.Domain/File1/File1.cs | 5 + Company.Domain/RollCallAgg/RollCall.cs | 5 + .../Pages/Company/ExcelUpload/Index.cshtml | 157 ++++++++++++++++++ .../Pages/Company/ExcelUpload/Index.cshtml.cs | 156 +++++++++++++++++ 4 files changed, 323 insertions(+) create mode 100644 ServiceHost/Areas/AdminNew/Pages/Company/ExcelUpload/Index.cshtml create mode 100644 ServiceHost/Areas/AdminNew/Pages/Company/ExcelUpload/Index.cshtml.cs diff --git a/Company.Domain/File1/File1.cs b/Company.Domain/File1/File1.cs index 5b0ecac7..4d6602fd 100644 --- a/Company.Domain/File1/File1.cs +++ b/Company.Domain/File1/File1.cs @@ -66,4 +66,9 @@ public class File1 : EntityBase Description = description; Status = status; } + + public void ChangeStatus(int status) + { + Status = status; + } } \ No newline at end of file diff --git a/Company.Domain/RollCallAgg/RollCall.cs b/Company.Domain/RollCallAgg/RollCall.cs index aa02f8b2..0fc6aa6f 100644 --- a/Company.Domain/RollCallAgg/RollCall.cs +++ b/Company.Domain/RollCallAgg/RollCall.cs @@ -531,6 +531,11 @@ namespace Company.Domain.RollCallAgg FridayWorkTimeSpan = CalculateFridayWorkDuration(StartDate.Value, EndDate.Value); } + public void SetStartDate(DateTime start) + { + StartDate = start; + } + /// /// جیزه /// diff --git a/ServiceHost/Areas/AdminNew/Pages/Company/ExcelUpload/Index.cshtml b/ServiceHost/Areas/AdminNew/Pages/Company/ExcelUpload/Index.cshtml new file mode 100644 index 00000000..9b1f6bbf --- /dev/null +++ b/ServiceHost/Areas/AdminNew/Pages/Company/ExcelUpload/Index.cshtml @@ -0,0 +1,157 @@ +@page +@model ServiceHost.Areas.AdminNew.Pages.Company.ExcelUpload.IndexModel +@{ + ViewData["Title"] = "بارگذاری فایل اکسل"; +} + +
+
+
+
+
+

بارگذاری و بررسی فایل اکسل

+
+
+
+
+ + +
+ +
+ + @if (!string.IsNullOrEmpty(Model.Message)) + { + + } +
+
+
+
+ + @if (Model.HasProcessed) + { +
+ +
+
+
+

فایل‌های موجود در اکسل (@Model.FoundInExcel.Count مورد)

+
+
+ @if (Model.FoundInExcel.Any()) + { + + + + + + + + + + + + + @{ + int index = 1; + } + @foreach (var item in Model.FoundInExcel) + { + + + + + + + + index++; + } + +
ردیفشناسهشماره بایگانیرده پروندهوضعیتعملیات
@index@item.ArchiveNo@item.FileClass@(item.Status == 2 ? "فعال" : "غیرفعال") + +
+ } + else + { +

هیچ موردی یافت نشد.

+ } +
+
+
+ + +
+
+
+

فایل‌های غیرموجود در اکسل (@Model.NotFoundInExcel.Count مورد)

+
+
+ @if (Model.NotFoundInExcel.Any()) + { + + + + + + + + + + + + + @{ + int index2 = 1; + } + @foreach (var item in Model.NotFoundInExcel) + { + + + + + + + + index2++; + } + +
ردیفشناسهشماره بایگانیرده پروندهوضعیتعملیات
@index2@item.ArchiveNo@item.FileClass@(item.Status == 2 ? "فعال" : "غیرفعال") + +
+ } + else + { +

هیچ موردی یافت نشد.

+ } +
+
+
+
+ } +
+ + + diff --git a/ServiceHost/Areas/AdminNew/Pages/Company/ExcelUpload/Index.cshtml.cs b/ServiceHost/Areas/AdminNew/Pages/Company/ExcelUpload/Index.cshtml.cs new file mode 100644 index 00000000..d0f144f8 --- /dev/null +++ b/ServiceHost/Areas/AdminNew/Pages/Company/ExcelUpload/Index.cshtml.cs @@ -0,0 +1,156 @@ +using Company.Domain.File1; +using Company.Domain.RollCallAgg; +using Company.Domain.RollCallAgg.DomainService; +using CompanyManagment.EFCore; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using OfficeOpenXml; + +namespace ServiceHost.Areas.AdminNew.Pages.Company.ExcelUpload; + +public class ExcelRowData +{ + public string ColumnB { get; set; } + public string ColumnC { get; set; } +} + +public class IndexModel : PageModel +{ + private readonly CompanyContext _dbContext; + private readonly IRollCallDomainService _rollCallDomainService; + + [BindProperty] + public IFormFile ExcelFile { get; set; } + + public string Message { get; set; } + public List FoundInExcel { get; set; } = new List(); + public List NotFoundInExcel { get; set; } = new List(); + public List ExcelData { get; set; } = new List(); + public bool HasProcessed { get; set; } + + public IndexModel(CompanyContext dbContext, IRollCallDomainService rollCallDomainService) + { + _dbContext = dbContext; + _rollCallDomainService = rollCallDomainService; + } + + public void OnGet() + { + } + + public async Task OnPostUploadExcel() + { + if (ExcelFile == null || ExcelFile.Length == 0) + { + Message = "لطفا یک فایل اکسل انتخاب کنید."; + return Page(); + } + + //await NewMethod(); + + // var rollcall = _dbContext.RollCalls.Where(x => x.id > 361628 && x.id < 362119).ToList(); + // + // var diffTime = TimeSpan.FromHours(8) + TimeSpan.FromMinutes(30); + // var NoneRollCalls = rollcall + // .Where(x => x.RollCallModifyType == RollCallModifyType.None && x.EndDate == null).ToList(); + // foreach (var noneRollCall in NoneRollCalls) + // { + // noneRollCall.SetStartDate(noneRollCall.StartDate!.Value.Add(diffTime)); + // } + // var rollcallIds = NoneRollCalls.Select(x => x.id).ToList(); + // var editedRollCall = rollcall.Where(x=>!rollcallIds.Contains(x.id) && x.RollCallModifyType != RollCallModifyType.EditByEmployer).ToList(); + // + // foreach (var rollCall in editedRollCall) + // { + // rollCall.Edit(rollCall.StartDate.Value.Add(diffTime), + // rollCall.EndDate.Value.Add(diffTime),_rollCallDomainService); + // } + // + // await _dbContext.SaveChangesAsync(); + return Page(); + } + + private async System.Threading.Tasks.Task NewMethod() + { + try + { + ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization"); + + using (var stream = new MemoryStream()) + { + await ExcelFile.CopyToAsync(stream); + stream.Position = 0; + + using (var package = new ExcelPackage(stream)) + { + var worksheet = package.Workbook.Worksheets[0]; + int rowCount = worksheet.Dimension?.Rows ?? 0; + + // خواندن مقادیر از ستون B و C از ردیف 2 به بعد + for (int row = 2; row <= rowCount; row++) + { + var columnB = worksheet.Cells[row, 2].Value?.ToString()?.Trim(); + var columnC = worksheet.Cells[row, 3].Value?.ToString()?.Trim(); + + if (!string.IsNullOrWhiteSpace(columnB) || !string.IsNullOrWhiteSpace(columnC)) + { + ExcelData.Add(new ExcelRowData + { + ColumnB = columnB ?? "", + ColumnC = columnC ?? "" + }); + } + } + } + } + + // ساخت HashSet برای سرچ سریع - هر جفت (B, C) رو با هم نگه داری + var excelPairs = new HashSet<(string B, string C)>( + ExcelData.Select(x => ( + B: (x.ColumnB ?? "").Trim(), + C: (x.ColumnC ?? "").Trim() + ))); + + // دریافت تمام داده‌های موجود در دیتابیس + var allFiles = _dbContext.Files.ToList(); + + // دسته‌بندی: فایل‌هایی که در اکسل هستند و نیستند + foreach (var file in allFiles) + { + var fileB = file.ArchiveNo.ToString(); + var fileC = (file.FileClass ?? "").Trim(); + + // بررسی آیا جفت (B, C) این فایل در اکسل وجود دارد + bool foundInExcel = excelPairs.Contains((fileB, fileC)); + + if (foundInExcel) + { + FoundInExcel.Add(file); + } + else + { + NotFoundInExcel.Add(file); + } + } + + foreach (var file1 in FoundInExcel) + { + file1.ChangeStatus(2); + } + + foreach (var file1 in NotFoundInExcel) + { + file1.ChangeStatus(1); + } + + await _dbContext.SaveChangesAsync(); + HasProcessed = true; + Message = $"پردازش با موفقیت انجام شد. تعداد ردیف‌های اکسل: {ExcelData.Count} | فایل‌های موجود در اکسل: {FoundInExcel.Count} | فایل‌های غیرموجود در اکسل: {NotFoundInExcel.Count}"; + } + catch (Exception ex) + { + Message = $"خطا در پردازش فایل: {ex.Message}"; + } + } +} +