diff --git a/WebDoorCreator.Data/Controllers/WebDoorCreatorController.cs b/WebDoorCreator.Data/Controllers/WebDoorCreatorController.cs index 4d8fef9..18cec1f 100644 --- a/WebDoorCreator.Data/Controllers/WebDoorCreatorController.cs +++ b/WebDoorCreator.Data/Controllers/WebDoorCreatorController.cs @@ -1,6 +1,8 @@ -using Microsoft.EntityFrameworkCore; +using Microsoft.Data.SqlClient; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using NLog; +using System.Collections.Generic; using WebDoorCreator.Data.DbModels; using WebDoorCreator.Data.DTO; @@ -93,7 +95,7 @@ namespace WebDoorCreator.Data.Controllers } catch (Exception exc) { - Log.Error($"Eccezione durante CompanyAddMod;{Environment.NewLine}{exc}"); + Log.Error($"Eccezione durante CompanyAddMod: {Environment.NewLine}{exc}"); } } return fatto; @@ -101,7 +103,7 @@ namespace WebDoorCreator.Data.Controllers #endregion Company methods - #region user methods + #region User methods /// /// Populating DTO to handle users @@ -133,6 +135,7 @@ namespace WebDoorCreator.Data.Controllers } return dbResult; } + /// /// Retrieving data from user/roles relation /// @@ -157,6 +160,7 @@ namespace WebDoorCreator.Data.Controllers } return dbResult; } + /// /// Retrieving data from users table /// @@ -181,6 +185,7 @@ namespace WebDoorCreator.Data.Controllers } return dbResult; } + /// /// Retrieving data from users table filtered by id /// @@ -200,7 +205,7 @@ namespace WebDoorCreator.Data.Controllers .OrderBy(x => x.Id) .FirstOrDefault(); - if(risultato != null) + if (risultato != null) { dbResult = risultato; } @@ -217,9 +222,9 @@ namespace WebDoorCreator.Data.Controllers return dbResult; } - #endregion user methods + #endregion User methods - #region roles methods + #region Roles methods /// /// Retrieving data from roles table @@ -245,8 +250,77 @@ namespace WebDoorCreator.Data.Controllers } return dbResult; } - #endregion roles methods + #endregion Roles methods + #region Order status methods + /// + /// Order status + /// + /// + /// + /// + /// + /// + public List GetOrderStatus(int companyId, int orderStatus, DateTime dataFrom, DateTime dataTo) + { + List dbResult = new List(); + using (var dbCtx = new WDCDataContext(_configuration)) + { + try + { + + var CompanyId = new SqlParameter("@CompanyId", companyId); + var OrderStatus = new SqlParameter("@OrderStatus", orderStatus); + var DataFrom = new SqlParameter("@DataFrom", dataFrom.Date); + var DataTo = new SqlParameter("@DataTo", dataTo.Date); + + var k = $"exec dbo.stp_OrderList_getFilt {companyId}, {orderStatus}, '{dataFrom.Date.ToString("yyyy/MM/dd")}', '{dataTo.Date.ToString("yyyy/MM/dd")}'"; + + dbResult = dbCtx + .DbSetOrderStatus + .FromSqlRaw("exec dbo.stp_OrderList_getFilt @CompanyId, @OrderStatus, @DataFrom, @DataTo", CompanyId, OrderStatus, DataFrom, DataTo) + .AsNoTracking() + .ToList(); + } + catch (Exception exc) + { + Log.Error($"Error in GetOrderStatus:{Environment.NewLine}{exc}"); + } + + } + return dbResult; + } + #endregion Order status methods + + #region Order methods + + /// + /// Adding a new order + /// + /// Record to add + /// + public async Task OrderAdd(OrderModel addRec) + { + bool fatto = false; + using (WDCDataContext localDbCtx = new WDCDataContext(_configuration)) + { + try + { + localDbCtx + .DbSetOrders + .Add(addRec); + await localDbCtx.SaveChangesAsync(); + fatto = true; + } + catch (Exception exc) + { + Log.Error($"Eccezione durante OrderAd: {Environment.NewLine}{exc}"); + } + } + return fatto; + } + + #endregion Order methods } } \ No newline at end of file diff --git a/WebDoorCreator.Data/DbModels/OrderStatusViewModel.cs b/WebDoorCreator.Data/DbModels/OrderStatusViewModel.cs new file mode 100644 index 0000000..d1911bf --- /dev/null +++ b/WebDoorCreator.Data/DbModels/OrderStatusViewModel.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +// +// This is here so CodeMaid doesn't reorganize this document +// +namespace WebDoorCreator.Data.DbModels +{ + /// + /// View to retrieve data from multiple tables + /// + [Table("v_OrderStatus")] + public class OrderStatusViewModel + { + /// + /// OrderId from Order table + /// + [Key] + public int OrderId { get; set; } = 0; + /// + /// CompanyId from Order table + /// + public int CompanyId { get; set; } = 0; + /// + /// OrderExtCode from Order table + /// + public string OrderExtCode { get; set; } = ""; + + /// + /// DateIns from Order table + /// + public DateTime DateIns { get; set; } + + /// + /// UserIdIns from Order table + /// + public string UserIdIns { get; set; } = ""; + + /// + /// UserIdMod from Order table + /// + public string UserIdMod { get; set; } = ""; + + /// + /// OrderStatus from Order table + /// + public int OrderStatus { get; set; } = 0; + + /// + /// OrderDescript from Order table + /// + public string OrderDescript { get; set; } = ""; + + /// + /// NumType sums all the different types of doors in the order + /// + public int NumType { get; set; } = 0; + + /// + /// NumDoors sums all the different doors in the order + /// + public int NumDoors { get; set; } = 0; + + /// + /// TotCost represent the total cost of the order + /// + public decimal TotCost { get; set; } = 0; + } +} diff --git a/WebDoorCreator.Data/WDCDataContext.cs b/WebDoorCreator.Data/WDCDataContext.cs index 79576a3..ce44136 100644 --- a/WebDoorCreator.Data/WDCDataContext.cs +++ b/WebDoorCreator.Data/WDCDataContext.cs @@ -57,6 +57,7 @@ namespace WebDoorCreator.Data public virtual DbSet DbSetDoor { get; set; } public virtual DbSet DbSetDoorType { get; set; } public virtual DbSet DbSetUsersView { get; set; } + public virtual DbSet DbSetOrderStatus { get; set; } diff --git a/WebDoorCreator.UI/Components/NavMenuHorizontal.razor b/WebDoorCreator.UI/Components/NavMenuHorizontal.razor index 448912a..10cb4a7 100644 --- a/WebDoorCreator.UI/Components/NavMenuHorizontal.razor +++ b/WebDoorCreator.UI/Components/NavMenuHorizontal.razor @@ -11,11 +11,15 @@ aria-expanded="false" aria-label="Toggle navigation"> - + + + + + diff --git a/WebDoorCreator.UI/Components/OrderList.razor b/WebDoorCreator.UI/Components/OrderList.razor new file mode 100644 index 0000000..ca662d5 --- /dev/null +++ b/WebDoorCreator.UI/Components/OrderList.razor @@ -0,0 +1,40 @@ +@if (ListOrdersStatus == null) +{ + +} +else +{ + + + + + + + + + + + + + + + @foreach (var item in ListOrdersStatus) + { + + + + + + + + + + + } + +
Order DateOrder NumberOrder DescriptionDoors NumberModel NumberTOTAL COSTPROGRESS
@item.DateIns@item.OrderId@item.OrderDescript@item.NumDoors@item.NumType@item.TotCost +
+
+
+
+} diff --git a/WebDoorCreator.UI/Components/OrderList.razor.cs b/WebDoorCreator.UI/Components/OrderList.razor.cs new file mode 100644 index 0000000..def0b50 --- /dev/null +++ b/WebDoorCreator.UI/Components/OrderList.razor.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Components; +using System.Net.Http; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Components.Authorization; +using Microsoft.AspNetCore.Components.Forms; +using Microsoft.AspNetCore.Components.Routing; +using Microsoft.AspNetCore.Components.Web; +using Microsoft.AspNetCore.Components.Web.Virtualization; +using Microsoft.JSInterop; +using WebDoorCreator.UI; +using WebDoorCreator.UI.Components; +using WebDoorCreator.UI.Shared; +using WebDoorCreator.Data.DbModels; +using WebDoorCreator.UI.Data; + +namespace WebDoorCreator.UI.Components +{ + public partial class OrderList + { + #region Protected Properties + + [Inject] + protected WebDoorCreatorService WDService { get; set; } = null!; + [Inject] + protected IJSRuntime JSRuntime { get; set; } = null!; + + [Parameter] + public EventCallback E_currOrderStatus { get; set; } + + #endregion Protected Properties + + #region Protected Methods + + protected override async Task OnInitializedAsync() + { + await ReloadData(); + } + + #endregion Protected Methods + + #region Private Fields + + private List? ListOrdersStatus = null; + + #endregion Private Fields + + #region Private Methods + + //protected List? UsersList { get; set; } = null; + //protected List? RolesList { get; set; } = null; + + protected OrderStatusViewModel? currOrder { get; set; } = null; + + protected bool isModRole { get; set; } = false; + + private async Task ReloadData() + { + var adesso = DateTime.Now.Date; + ListOrdersStatus = null; + await Task.Delay(1); + ListOrdersStatus = await WDService.GetOrderStatus(0, 0, adesso.AddYears(-2), adesso); + await Task.Delay(1); + await InvokeAsync(StateHasChanged); + } + private async Task setCurrOrder(string userId) + { + await Task.Delay(1); + } + + protected string setPgColor(int progress) + { + string answ = ""; + if(progress == 1) + { + answ = "#D35400"; + } + else if (progress == 2) + { + answ = "#F1C40F"; + } + else if (progress == 3) + { + answ = "#2980B9"; + } + else if (progress == 4) + { + answ = "#8E44AD"; + } + else if (progress == 5) + { + answ = "#27AE60"; + } + + return answ; + } + + //private async Task editRec(CompanyModel currComp) + //{ + // await E_currCompany.InvokeAsync(currComp); + //} + + #endregion Private Methods + } +} \ No newline at end of file diff --git a/WebDoorCreator.UI/Data/WebDoorCreatorService.cs b/WebDoorCreator.UI/Data/WebDoorCreatorService.cs index 5db8b4b..4550a74 100644 --- a/WebDoorCreator.UI/Data/WebDoorCreatorService.cs +++ b/WebDoorCreator.UI/Data/WebDoorCreatorService.cs @@ -7,6 +7,7 @@ using WebDoorCreator.Data.Controllers; using WebDoorCreator.Data.DbModels; using EgwCoreLib.Razor.Data; using WebDoorCreator.Data.DTO; +using WebDoorCreator.Data; namespace WebDoorCreator.UI.Data { @@ -112,7 +113,7 @@ namespace WebDoorCreator.UI.Data { var dbResult = await dbController.CompanyAddMod(currRec); // elimino cache redis... - RedisValue pattern = new RedisValue($"{rKeyCompany}:cache:*"); + RedisValue pattern = new RedisValue($"{rKeyCompany}:*"); bool answ = await ExecFlushRedisPattern(pattern); await Task.Delay(1); return dbResult; @@ -299,6 +300,7 @@ namespace WebDoorCreator.UI.Data } #endregion User Methods + /*----------------------------------------------------------------------------------------------------------------------*/ #region Roles Methods @@ -344,7 +346,70 @@ namespace WebDoorCreator.UI.Data return dbResult; } #endregion Roles Methods + /*----------------------------------------------------------------------------------------------------------------------*/ + + #region Order status Methods + public async Task?> GetOrderStatus(int companyId, int orderStatus, DateTime dataFrom, DateTime dataTo) + { + string source = "DB"; + + List? dbResult = new List(); + // cerco da cache + string currKey = rKeyOrderStatus; + Stopwatch stopWatch = new Stopwatch(); + stopWatch.Start(); + string? rawData = await redisDb.StringGetAsync(currKey); + if (!string.IsNullOrEmpty(rawData)) + { + source = "REDIS"; + var tempResult = JsonConvert.DeserializeObject>(rawData); + if (tempResult == null) + { + dbResult = new List(); + } + else + { + dbResult = tempResult; + } + } + else + { + dbResult = dbController.GetOrderStatus(companyId, orderStatus, dataFrom, dataTo); + rawData = JsonConvert.SerializeObject(dbResult, JSSettings); + await redisDb.StringSetAsync(currKey, rawData, UltraLongCache); + } + if (dbResult == null) + { + dbResult = new List(); + } + stopWatch.Stop(); + TimeSpan ts = stopWatch.Elapsed; + Log.Debug($"GetOrderStatus | {source} in: {ts.TotalMilliseconds} ms"); + return dbResult; + } + + #endregion Order status Methods + + #region Order methods + + /// + /// Add new order + /// + /// + /// + public async Task OrderAdd(OrderModel currRec) + { + var dbResult = await dbController.OrderAdd(currRec); + // elimino cache redis... + RedisValue pattern = new RedisValue($"{rKeyOrderStatus}:*"); + bool answ = await ExecFlushRedisPattern(pattern); + await Task.Delay(1); + return dbResult; + } + + #endregion Order methods + #endregion Public Methods #region Protected Fields @@ -384,6 +449,7 @@ namespace WebDoorCreator.UI.Data //#endregion Public Methods protected const string rKeyCompany = $"{redisBaseAddr}:Cache:Company"; + protected const string rKeyOrderStatus = $"{redisBaseAddr}:Cache:OrderStatus"; protected const string rKeyUsers = $"{redisBaseAddr}:Cache:Users"; protected const string rKeyUsersView = $"{redisBaseAddr}:Cache:UsersView"; protected const string rKeyRoles = $"{redisBaseAddr}:Cache:Roles"; diff --git a/WebDoorCreator.UI/Pages/OrdersHomePage.razor b/WebDoorCreator.UI/Pages/OrdersHomePage.razor index a5bf1b5..cfcef2a 100644 --- a/WebDoorCreator.UI/Pages/OrdersHomePage.razor +++ b/WebDoorCreator.UI/Pages/OrdersHomePage.razor @@ -1,4 +1,56 @@ @page "/OrdersHomePage" -

ORDERS

+ + +
+
+
+ ORDERS +
+
+
+ +
+
Orders list
+ +
+ + +
+
+ + +
+
+ + diff --git a/WebDoorCreator.UI/Pages/OrdersHomePage.razor.cs b/WebDoorCreator.UI/Pages/OrdersHomePage.razor.cs index f38c8a9..dbca2ee 100644 --- a/WebDoorCreator.UI/Pages/OrdersHomePage.razor.cs +++ b/WebDoorCreator.UI/Pages/OrdersHomePage.razor.cs @@ -13,10 +13,84 @@ using Microsoft.AspNetCore.Components.Web.Virtualization; using Microsoft.JSInterop; using WebDoorCreator.UI; using WebDoorCreator.UI.Shared; +using WebDoorCreator.Data.DbModels; +using WebDoorCreator.UI.Data; +using Microsoft.AspNetCore.Identity; namespace WebDoorCreator.UI.Pages { public partial class OrdersHomePage { + #region Protected Properties + + [Inject] + protected WebDoorCreatorService WDService { get; set; } = null!; + [Inject] + protected IJSRuntime JSRuntime { get; set; } = null!; + [Inject] + protected UserManager _userManager { get; set; } = null!; + [Inject] + protected NavigationManager NavManager { get; set; } = null!; + + [Parameter] + public EventCallback E_currUser { get; set; } + + #endregion Protected Properties + + + #region Private Fields + + protected string _orderCodExt = ""; + protected string orderCodExt + { + get => _orderCodExt; + set => _orderCodExt = value; + } + protected string _orderDescr = ""; + protected string orderDescr + { + get => _orderDescr; + set => _orderDescr = value; + } + + private List? ListRecords = null; + + #endregion Private Fields + + #region Private Methods + + protected List? UsersList { get; set; } = null; + protected List? RolesList { get; set; } = null; + + protected AspNetUsers? currUser { get; set; } = null; + + protected bool isModRole { get; set; } = false; + + protected async Task addNewOrder(string userName) + { + var user = await _userManager.FindByNameAsync(userName); + + OrderModel addRec = new OrderModel() + { + CompanyId = 2, + OrderExtCode = orderCodExt, + DateIns = DateTime.Now, + UserIdIns = user.Id, + DateMod = DateTime.Now, + UserIdMod = user.Id, + Status = Core.Enum.OrderStatus.DoorDef, + OrderDescript = orderDescr + }; + + var done = await WDService.OrderAdd(addRec); + + if(done) + { + NavManager.NavigateTo(NavManager.Uri, true); + } + } + + + #endregion Private Methods } } \ No newline at end of file