This commit is contained in:
DavidMakarov 2024-05-30 01:18:57 +04:00
commit b2cdac8391
20 changed files with 223 additions and 106 deletions

View File

@ -36,7 +36,10 @@ namespace FactoryBusinessLogic.BusinessLogics
}
return products;
}
public List<WorkpieceTimeReportViewModel> GetWorkpieces(ClientSearchModel client, ReportBindingModel model)
{
return _workpieceStorage.GetTimeReport(client, model);
}
public void SaveWorkpiecesToPdfFile(ClientSearchModel client, ReportBindingModel model)
{
_saveToPdf.CreateWorkerDoc(new WorkerPdfInfo
@ -45,15 +48,16 @@ namespace FactoryBusinessLogic.BusinessLogics
Title = "Список заготовок",
DateFrom = model.DateFrom!.Value,
DateTo = model.DateTo!.Value,
Workpieces = GetWorkpieces(client, model)
});
}
public void SaveProductsToExcelFile(ReportBindingModel model, List<int> plans)
public void SaveProductsToExcelFile(ReportBindingModel model, List<int> ids)
{
_saveToExcel.CreateWorkerReport(new WorkerExcelInfo
{
FileName = model.FileName,
Title = "Список планов",
//PlanProductionProducts = GetProductsByPlanProduction(plans)
PlanProductionProducts = GetProductsByPlanProduction(ids)
});
}
public void SaveProudctsToWordFile(ReportBindingModel model, List<int> ids)
@ -63,7 +67,7 @@ namespace FactoryBusinessLogic.BusinessLogics
{
FileName = model.FileName,
Title = "Список планов",
//PlanProductionProducts = GetProductsByPlanProduction(plans)
PlanProductionProducts = GetProductsByPlanProduction(ids)
});
}
}

View File

@ -114,23 +114,43 @@ namespace FactoryBusinessLogic.OfficePackage
Style = "Normal",
ParagraphAlignment = PdfParagraphAlignmentType.Left
});
//var tupleList = machineNames.Zip(phaseNames, Tuple.Create);
//foreach (var tuple in tupleList)
//{
// CreateRow(new PdfRowParameters
// {
// Texts = new List<string>
// {
// string.Empty,
// tuple.Item1,
// tuple.Item2,
// },
// Style = "Normal",
// ParagraphAlignment = PdfParagraphAlignmentType.Left
// });
//}
var phaseNames = workpiece.ExecutionPhases.Select(x => x.ExecutionPhaseName).ToList();
var machineNames = workpiece.Machines.Select(x => x.MachineName).ToList();
if (phaseNames.Count != machineNames.Count)
{
if (phaseNames.Count > machineNames.Count)
{
var diff = phaseNames.Count - machineNames.Count;
for (int i = 0; i < diff; i++)
{
machineNames.Add(string.Empty);
}
}
else
{
var diff = machineNames.Count - phaseNames.Count;
for (int i = 0; i < diff; i++)
{
phaseNames.Add(string.Empty);
}
}
}
var tupleList = machineNames.Zip(phaseNames, Tuple.Create);
foreach (var tuple in tupleList)
{
CreateRow(new PdfRowParameters
{
Texts = new List<string>
{
string.Empty,
tuple.Item1,
tuple.Item2,
},
Style = "Normal",
ParagraphAlignment = PdfParagraphAlignmentType.Left
});
}
}
SaveWorkerPdf(info);
}

View File

@ -72,28 +72,37 @@ namespace FactoryBusinessLogic.OfficePackage
});
foreach (var ppp in info.PlanProductionProducts)
{
var t = ppp.Products;
List<(string, WordTextProperties)> texts = new List<(string, WordTextProperties)>
{
(ppp.ProductionName, new WordTextProperties { Bold = true, Size = "24", })
};
foreach (var product in ppp.Products)
CreateParagraph(new WordParagraph
{
Texts = texts,
TextProperties = new WordTextProperties
{
Size = "24",
JustificationType = WordJustificationType.Both
}
});
foreach (var product in ppp.Products)
{
StringBuilder stringBuilder = new StringBuilder();
texts = new List<(string, WordTextProperties)>();
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append(product.ProductName);
stringBuilder.Append(" — ");
stringBuilder.Append(product.Price.ToString());
texts.Add((stringBuilder.ToString(), new WordTextProperties { Size = "24" }));
}
CreateParagraph(new WordParagraph
{
Texts = texts,
TextProperties = new WordTextProperties
{
Size = "24",
JustificationType = WordJustificationType.Both
}
});
CreateParagraph(new WordParagraph
{
Texts = texts,
TextProperties = new WordTextProperties
{
Size = "24",
JustificationType = WordJustificationType.Both
}
});
}
}
SaveWorkerWord(info);
}

View File

@ -7,7 +7,8 @@ namespace FactoryContracts.BusinessLogicsContracts
public interface IWorkerReportLogic
{
List<PlanProductionProductReportViewModel> GetProductsByPlanProduction(List<int> plans);
void SaveProudctsToWordFile(ReportBindingModel model, List<int> plans);
List<WorkpieceTimeReportViewModel> GetWorkpieces(ClientSearchModel client, ReportBindingModel model);
void SaveProudctsToWordFile(ReportBindingModel model, List<int> plans);
void SaveProductsToExcelFile(ReportBindingModel model, List<int> plans);
void SaveWorkpiecesToPdfFile(ClientSearchModel client, ReportBindingModel model);

View File

@ -9,6 +9,7 @@ namespace FactoryContracts.StoragesContracts
List<WorkpieceViewModel> GetFullList();
List<WorkpieceViewModel> GetFilteredList(WorkpieceSearchModel model);
List<WorkpieceTimeReportViewModel> GetTimeReport(ClientSearchModel client, ReportBindingModel model);
WorkpieceViewModel? GetElement(WorkpieceSearchModel model);

View File

@ -4,6 +4,7 @@ using FactoryContracts.StoragesContracts;
using FactoryContracts.ViewModels;
using FactoryDatabaseImplement.Models;
using Microsoft.EntityFrameworkCore;
using System.Runtime.CompilerServices;
namespace FactoryDatabaseImplement.Implements
{

View File

@ -127,8 +127,9 @@ namespace FactoryDatabaseImplement.Implements
{
using var context = new FactoryDatabase();
return context.PlanProductions
.Distinct()
.Where(plan => ids.Contains(plan.Id))
.Select(plan => new PlanProductionProductReportViewModel()
.Select(plan => new PlanProductionProductReportViewModel()
{
ProductionName = plan.ProductionName,
Products = context.WorkpieceProducts
@ -136,8 +137,8 @@ namespace FactoryDatabaseImplement.Implements
.Include(x => x.Workpiece)
.Where(product => plan.Id == product.Product.Id)
.Select(x => x.Product.GetViewModel)
.ToList()
})
.ToList()
})
.ToList();
}
}

View File

@ -111,8 +111,8 @@ namespace FactoryDatabaseImplement.Implements
.Include(x => x.Client)
.Include(x => x.PlanProductions)
.ThenInclude(x => x.PlanProduction)
.Where(x => x.ClientId == client.Id)
.Select(x => new WorkpieceTimeReportViewModel
.Where(x => x.DateCreate <= model.DateTo && x.DateCreate >= model.DateFrom)
.Select(x => new WorkpieceTimeReportViewModel
{
WorkpieceName = x.WorkpieceName,
Machines = context.PlanProductionWorkpieces
@ -120,7 +120,7 @@ namespace FactoryDatabaseImplement.Implements
.Where(ppw => ppw.WorkpieceId == x.Id)
.Select(ppw => ppw.PlanProduction.Machines
.Where(m => m.PlanProductionId == ppw.PlanProductionId)
.Select(m => m.Machine.GetViewModel).ToList()).FirstOrDefault()!,
.Select(m => m.Machine.GetViewModel).ToList()).FirstOrDefault(),
ExecutionPhases = context.ExecutionPhases
.Where(ep => ep.PlanProductionId.HasValue)
.Include(ep => ep.PlanProduction)

View File

@ -1,4 +1,5 @@
using DocumentFormat.OpenXml.Office2010.Excel;
using FactoryBuisinessLogic.MailWorker;
using FactoryBusinessLogic.BusinessLogics;
using FactoryContracts.BindingModels;
using FactoryContracts.BusinessLogicsContracts;
@ -18,14 +19,16 @@ namespace FactoryWorkerApp.Controllers
private readonly ILogger<HomeController> _logger;
private readonly WorkerLogic _logic;
private readonly IWorkerReportLogic _workerReportLogic;
private bool IsLoggedIn { get { return Client.user != null; } }
private readonly AbstractMailWorker _abstractMailWorker;
private bool IsLoggedIn { get { return Client.user != null; } }
private int UserId { get { return Client.user!.Id; } }
public HomeController(ILogger<HomeController> logger, WorkerLogic logic, IWorkerReportLogic workerReportLogic)
public HomeController(ILogger<HomeController> logger, WorkerLogic logic, IWorkerReportLogic workerReportLogic, AbstractMailWorker abstractMailWorker)
{
_logger = logger;
_logic = logic;
_workerReportLogic = workerReportLogic;
_workerReportLogic = workerReportLogic;
_abstractMailWorker = abstractMailWorker;
}
public IActionResult Index()
@ -238,7 +241,7 @@ namespace FactoryWorkerApp.Controllers
{
return Redirect("Index");
}
ViewBag.plans = _logic.GetPlanProductions(Client.user!.Id);
ViewBag.ids = _logic.GetPlanProductions(Client.user!.Id);
return View();
}
@ -249,7 +252,8 @@ namespace FactoryWorkerApp.Controllers
{
return Redirect("Index");
}
var report = _workerReportLogic.GetProductsByPlanProduction(plans);
ViewBag.ids = plans;
var report = _workerReportLogic.GetProductsByPlanProduction(plans);
return View(report);
}
@ -277,7 +281,7 @@ namespace FactoryWorkerApp.Controllers
HttpContext.Session.SetString("StartDate", startDate.ToString());
HttpContext.Session.SetString("EndDate", endDate.ToString());
return RedirectToAction("WorkpieceTimeReport");
return RedirectToAction("WorkpieceDateReport");
}
[HttpGet]
@ -288,13 +292,19 @@ namespace FactoryWorkerApp.Controllers
var startDate = DateTime.Parse(startDateStr);
var endDate = DateTime.Parse(endDateStr).AddDays(1);
var values = _logic.GetWorkpieceTime(startDate, endDate, Client.user.Id);
ViewBag.StartDate = startDate;
ViewBag.EndDate = endDate;
return View(values);
var reports = _workerReportLogic.GetWorkpieces(
new ClientSearchModel
{
Id = Client.user.Id
},
new ReportBindingModel
{
DateFrom = startDate,
DateTo = endDate,
});
return View(reports);
}
[HttpGet]
@ -345,6 +355,55 @@ namespace FactoryWorkerApp.Controllers
_logic.CreateExecutionPhase(model);
return RedirectToAction("ExecutionPhases");
}
[HttpPost]
public IActionResult CreateWord(List<int> ids)
{
_workerReportLogic.SaveProudctsToWordFile(
new ReportBindingModel
{
FileName = "D:\\temp\\report.docx"
},
ids);
return PhysicalFile("D:\\temp\\report.docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "Отчет по изделиям.docx");
}
[HttpPost]
public IActionResult CreateExcel(List<int> ids)
{
_workerReportLogic.SaveProductsToExcelFile(
new ReportBindingModel
{
FileName = "D:\\temp\\report.xlsx"
},
ids);
return PhysicalFile("D:\\temp\\report.xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Отчет по изделиям.xlsx");
}
[HttpPost]
public IActionResult SendMail()
{
var startDateStr = HttpContext.Session.GetString("StartDate");
var endDateStr = HttpContext.Session.GetString("EndDate");
var startDate = DateTime.Parse(startDateStr);
var endDate = DateTime.Parse(endDateStr).AddDays(1);
_workerReportLogic.SaveWorkpiecesToPdfFile(
new ClientSearchModel
{
Id = Client.user.Id
},
new ReportBindingModel
{
DateFrom = startDate,
DateTo = endDate,
FileName = "D:\\temp\\report.pdf"
});
_abstractMailWorker.MailSendAsync(new MailSendInfoBindingModel
{
MailAddress = Client.user.Email,
Subject = $"Отчет по заготовкам пользователя {Client.user.Login}",
Text = $"Отчет по заготовкам с {startDate.ToShortDateString()} по {endDate.ToShortDateString()}"
});
return Redirect("Index");
}
}
}
}

View File

@ -5,6 +5,8 @@ using FactoryDatabaseImplement.Implements;
using FactoryWorkerApp;
using FactoryBusinessLogic.OfficePackage;
using FactoryBusinessLogic.OfficePackage.Implements;
using FactoryBuisinessLogic.MailWorker;
using FactoryContracts.BindingModels;
var builder = WebApplication.CreateBuilder(args);
@ -32,6 +34,8 @@ builder.Services.AddTransient<WorkerLogic>();
builder.Services.AddTransient<AbstractSaveToExcel, SaveToExcel>();
builder.Services.AddTransient<AbstractSaveToPdf, SaveToPdf>();
builder.Services.AddTransient<AbstractSaveToWord, SaveToWord>();
builder.Services.AddSingleton<AbstractMailWorker, MailKitWorker>();
builder.Services.AddSession(options =>
{
@ -43,6 +47,17 @@ builder.Services.AddSession(options =>
var app = builder.Build();
var mailSender = app.Services.GetService<AbstractMailWorker>();
mailSender?.MailConfig(new MailConfigBindingModel
{
MailLogin = builder.Configuration?.GetSection("MailLogin")?.Value?.ToString() ?? string.Empty,
MailPassword = builder.Configuration?.GetSection("MailPassword")?.Value?.ToString() ?? string.Empty,
SmtpClientHost = builder.Configuration?.GetSection("SmtpClientHost")?.Value?.ToString() ?? string.Empty,
SmtpClientPort = Convert.ToInt32(builder.Configuration?.GetSection("SmtpClientPort")?.Value?.ToString()),
PopHost = builder.Configuration?.GetSection("PopHost")?.Value?.ToString() ?? string.Empty,
PopPort = Convert.ToInt32(builder.Configuration?.GetSection("PopPort")?.Value?.ToString())
});
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
@ -55,6 +70,7 @@ app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseSession();
app.UseAuthorization();

View File

@ -14,7 +14,7 @@
<div class="row">Выберите планы</div>
<div class="row">
<div class="col-4">Планы:</div>
<select name="plans" class="form-control border border-dark rounded" multiple size="5" asp-items="@(new SelectList(ViewBag.plans, "Id", "ProductionName"))">
<select name="plans" class="form-control border border-dark rounded" multiple size="5" asp-items="@(new SelectList(ViewBag.ids, "Id", "ProductionName"))">
</select>
</div>
<button type="submit" class="btn btn-primary">Создать отчёт</button>

View File

@ -10,20 +10,12 @@
<div class="text-center">
@{
//if (Model == null)
//{
// <h3 class="display-4">Авторизируйтесь</h3>
// return;
//}
<p>
<a asp-action="Workpieces">Заготовки</a>
</p>
<p>
<a asp-action="PlanProductions">Планы производства</a>
</p>
<p>
<a asp-action="ConnectionPlanProductionWorkpiece">Привязка планов производства к заготовкам</a>
</p>
<p>
<a asp-action="ExecutionPhases">Этапы выполнения</a>

View File

@ -11,15 +11,10 @@
<div class="text-center">
@{
if (Model == null)
{
<h3 class="display-4">Авторизируйтесь</h3>
return;
}
<p>
<a asp-action="PlanProduction">Создать план</a>
<a asp-action="ConnectionPlanProductionWorkpiece">Привязка планов производства к заготовкам</a>
</p>
<table class="table">

View File

@ -9,10 +9,26 @@
<h1 class="display-4">Список изделий по планам производств</h1>
</div>
<div class="d-flex">
<form asp-controller="ReportToWord" method="post">
<form asp-controller="Home" asp-action="CreateWord" method="post">
<div style="display: none;">
<select name="ids" multiple>
@foreach (var it in ViewBag.ids)
{
<option value="@(it)" selected="selected"></option>
}
</select>
</div>
<button type="submit" class="btn btn-primary me-3">Сгенерировать отчет в Word</button>
</form>
<form asp-controller="ReportToExcel" method="post">
<form asp-controller="Home" asp-action="CreateExcel" method="post">
<div style="display: none;">
<select name="ids" multiple>
@foreach (var it in ViewBag.ids)
{
<option value="@(it)" selected="selected"></option>
}
</select>
</div>
<button type="submit" class="btn btn-primary">Сгенерировать отчет в Excel</button>
</form>
</div>
@ -21,7 +37,7 @@
<thead>
<tr>
<th>План производства</th>
<th>Изделие</th>
<th>Изделие - Цена</th>
</tr>
</thead>
<tbody>
@ -33,7 +49,7 @@
<ul>
@foreach (var plan in planProduction.Products)
{
<li>@plan.ProductName</li>
<li>@plan.ProductName - @plan.Price</li>
}
</ul>
</td>

View File

@ -6,6 +6,6 @@
<h1 class="display-4">Выберите тип отчета</h1>
<div class="list-group">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="GetByPlans">Отчет изделий по производствам</a>
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="WorkpieceDateReport">Отчет по заготовкам по датам</a>
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="WorkpieceTimeChoose">Отчет по заготовкам по датам</a>
</div>
</div>

View File

@ -10,7 +10,9 @@
<h1 class="display-4">Список заготовок за период</h1>
</div>
<form asp-controller="Report" method="post">
<form asp-controller="Home" asp-action="SendMail" method="post">
<input type="hidden" name="startDate" readonly value="@(ViewBag.startDate)" />
<input type="hidden" name="endDate" readonly value="@(ViewBag.endDate)" />
<button type="submit" class="btn btn-primary">Отправить отчет на почту</button>
</form>
@ -24,23 +26,23 @@
</tr>
</thead>
<tbody>
@foreach (var workpice in Model)
@foreach (var workpiece in Model)
{
<tr>
<td>@workpice.WorkpieceName</td>
<td>@workpiece.WorkpieceName</td>
<td>
<ul>
@foreach (var machine in workpice.Machines)
@foreach (var machine in workpiece.Machines)
{
<li>@machine</li>
<li>@machine.MachineName</li>
}
</ul>
</td>
<td>
<ul>
@foreach (var phase in workpice.ExecutionPhases)
@foreach (var phase in workpiece.ExecutionPhases)
{
<li>@phase</li>
<li>@phase.PlanProductionName</li>
}
</ul>
</td>

View File

@ -64,7 +64,7 @@
var formData = $('#TimeReportWeb').serialize();
$.post('/Home/TimeReportWeb', formData, function (response) {
window.location.href = '/Home/WorkpieceTimeReport';
window.location.href = '/Home/WorkpieceDateReport';
}).fail(function () {
alert('Произошла ошибка при создании отчета.');
});

View File

@ -33,6 +33,9 @@
<th>
Цена
</th>
<th>
Дата
</th>
<th>
Изменить заготовку
</th>
@ -54,6 +57,9 @@
<td>
@Html.DisplayFor(modelItem => item.Cost)
</td>
<td>
@Html.DisplayFor(modelItem => item.DateCreate)
</td>
<td>
<a asp-action="Workpiece" asp-route-id="@item.Id" class="btn btn-primary">Изменить</a>
</td>

View File

@ -114,28 +114,15 @@ namespace FactoryWorkerApp
{
return _productLogic.ReadList(null);
}
public List<WorkpieceTimeReportViewModel>? GetWorkpieceTime(DateTime? startDate, DateTime? endDate, int ClientId)
{
var workpieces = _workpieceLogic.ReadList(new() { DateFrom = startDate, DateTo = endDate, ClientId = ClientId });
if (workpieces == null)
return new();
List<WorkpieceTimeReportViewModel> detailTimeReports = new List<WorkpieceTimeReportViewModel>();
foreach (var i in workpieces)
{
WorkpieceTimeReportViewModel report = new();
var workpiece = _workpieceLogic.ReadElement(new() { Id = i.Id });
report.WorkpieceName = workpiece!.WorkpieceName;
var phases = _executionPhaseLogic.ReadList(new() { WorkpieceId = i.Id });
if (phases != null)
report.ExecutionPhases = phases.Select(w => w.ExecutionPhaseName).ToList();
var machines = _machineLogic.ReadList(new() { WorkpieceId = i.Id });
if (machines != null)
report.Machines = machines.Select(w => w.MachineName).ToList();
detailTimeReports.Add(report);
}
return detailTimeReports;
}
}
public List<WorkpieceTimeReportViewModel>? GetWorkpieceTime(DateTime? startDate, DateTime? endDate, int ClientId)
{
var workpieces = _workpieceLogic.ReadList(new() { DateFrom = startDate, DateTo = endDate, ClientId = ClientId });
if (workpieces == null)
return new();
List<WorkpieceTimeReportViewModel> detailTimeReports = new List<WorkpieceTimeReportViewModel>();
return detailTimeReports;
}
}
}

View File

@ -7,5 +7,12 @@
},
"AllowedHosts": "*",
"IPAddress": "http://localhost:5283/"
"IPAddress": "http://localhost:5283/",
"SmtpClientHost": "smtp.gmail.com",
"SmtpClientPort": "587",
"PopHost": "pop.gmail.com",
"PopPort": "995",
"MailLogin": "labworker83@gmail.com",
"MailPassword": "wpxc drvx lhqb uqpe"
}