From 2f6070438a73306954babb24fa1af250acd8b0c7 Mon Sep 17 00:00:00 2001 From: "zaccaria.majid" Date: Fri, 3 Feb 2023 12:09:53 +0100 Subject: [PATCH 01/50] porting nuget inve --- MP.INVE/Components/DataPager.razor | 72 -------- MP.INVE/Components/DataPager.razor.cs | 205 ---------------------- MP.INVE/Components/LoadingData.razor | 10 -- MP.INVE/Components/LoadingDataSmall.razor | 6 - MP.INVE/Data/MiDataService.cs | 5 +- MP.INVE/_Imports.razor | 1 + 6 files changed, 4 insertions(+), 295 deletions(-) delete mode 100644 MP.INVE/Components/DataPager.razor delete mode 100644 MP.INVE/Components/DataPager.razor.cs delete mode 100644 MP.INVE/Components/LoadingData.razor delete mode 100644 MP.INVE/Components/LoadingDataSmall.razor diff --git a/MP.INVE/Components/DataPager.razor b/MP.INVE/Components/DataPager.razor deleted file mode 100644 index 79cfe69e..00000000 --- a/MP.INVE/Components/DataPager.razor +++ /dev/null @@ -1,72 +0,0 @@ - - -
-
-
-
- @if (totalCount > 0) - { -
    -
  • -
  • - @for (int i = @startPage; i <= endPage; ++i) - { - var pageNum = i; -
  • - } -
  • -
  • -
- } -
-
-
-
- @if (showLoading) - { -
-
-
- } -
-
-
-
-
-
- @if (!showLoading) - { - @totalCount records - } -
-
- @if (totalCount > 0) - { -
- @if (multi) - { - - } - else - { - - - } -
- } -
-
-
-
diff --git a/MP.INVE/Components/DataPager.razor.cs b/MP.INVE/Components/DataPager.razor.cs deleted file mode 100644 index d317bd32..00000000 --- a/MP.INVE/Components/DataPager.razor.cs +++ /dev/null @@ -1,205 +0,0 @@ -using Microsoft.AspNetCore.Components; - -namespace MP.INVE.Components -{ - public partial class DataPager : ComponentBase - { - #region Public Properties - - [Inject] - protected NavigationManager NavManager { get; set; } = null!; - - [Parameter] - public int currPage - { - get - { - return _numPage; - } - set - { - bool doReport = !_numPage.Equals(value); - if (doReport) - { - _numPage = value; - reportChangePage(); - } - } - } - - [Parameter] - public EventCallback numPageChanged { get; set; } - - [Parameter] - public EventCallback numRecordChanged { get; set; } - - [Parameter] - public int PageSize - { - get - { - return _numRecord; - } - set - { - bool doReport = !_numRecord.Equals(value); - if (doReport) - { - _numRecord = value; - reportChange(); - resetCurrPage(); - } - } - } - - [Parameter] - public bool showLoading - { - get - { - return _showLoading; - } - set - { - if (value) - { - Random random = new Random(); - percLoading = random.Next(30, 90); - } - else - { - percLoading = 5; - } - _showLoading = value; - } - } - - [Parameter] - public int totalCount { get; set; } = 0; - - #endregion Public Properties - - #region Public Methods - - public void resetCurrPage() - { - //await Task.Delay(1); - currPage = 1; - } - - #endregion Public Methods - - #region Protected Fields - - protected bool _showLoading = false; - - #endregion Protected Fields - - #region Protected Properties - - protected int _numPage { get; set; } = 1; - - protected int _numRecord { get; set; } = 10; - - protected int percLoading { get; set; } = 0; - - #endregion Protected Properties - - #region Protected Methods - - protected string cssActive(int numPage) - { - string answ = ""; - if (numPage == currPage) - { - answ = "active"; - } - return answ; - } - protected bool multi=false; - protected override async Task OnInitializedAsync() - { - if (NavManager.Uri.Contains("OperatoreQR")) - { - multi = true; - } - await Task.Run(() => showLoading = false); - } - - protected void PaginationItemClick(int page) - { - currPage = page; - } - - #endregion Protected Methods - - #region Private Properties - - private int endPage - { - get - { - int answ = (int)(currPage / numPages) * numPages + numPages; - answ = answ < LastPage ? answ : LastPage; - return answ; - } - } - - private int LastPage - { - get - { - return Math.Max((int)Math.Ceiling(totalCount / (double)PageSize), 1); - } - } - - private int nextBlock - { - get - { - int answ = currPage + numPages; - answ = answ < LastPage ? answ : LastPage; - return answ; - } - } - - private int numPages { get; set; } = 10; - - private int prevBlock - { - get - { - int answ = currPage - numPages; - answ = answ > 0 ? answ : 1; - return answ; - } - } - - // calcola un set 1 .. numPages centrato sulla pagina corrente... - private int startPage - { - get - { - int answ = (int)(currPage / numPages) * numPages; - answ = answ > 0 ? answ : 1; - return answ; - } - } - - #endregion Private Properties - - #region Private Methods - - private void reportChange() - { - numRecordChanged.InvokeAsync(PageSize); - } - - private void reportChangePage() - { - numPageChanged.InvokeAsync(currPage); - } - - #endregion Private Methods - } -} \ No newline at end of file diff --git a/MP.INVE/Components/LoadingData.razor b/MP.INVE/Components/LoadingData.razor deleted file mode 100644 index caba34d1..00000000 --- a/MP.INVE/Components/LoadingData.razor +++ /dev/null @@ -1,10 +0,0 @@ -
-
-

MAPO INVE

- EgalWare MES suite -
-
-

loading data

- -
-
\ No newline at end of file diff --git a/MP.INVE/Components/LoadingDataSmall.razor b/MP.INVE/Components/LoadingDataSmall.razor deleted file mode 100644 index 2217cf02..00000000 --- a/MP.INVE/Components/LoadingDataSmall.razor +++ /dev/null @@ -1,6 +0,0 @@ -
-
- loading data - -
-
\ No newline at end of file diff --git a/MP.INVE/Data/MiDataService.cs b/MP.INVE/Data/MiDataService.cs index cdbe9d92..6e0ed436 100644 --- a/MP.INVE/Data/MiDataService.cs +++ b/MP.INVE/Data/MiDataService.cs @@ -1,10 +1,11 @@ -using Egw.Core; -using MP.Data.Conf; +using MP.Data.Conf; using MP.Data.DatabaseModels; using Newtonsoft.Json; using NLog; using StackExchange.Redis; using System.Diagnostics; +using EgwCoreLib.Razor; +using EgwCoreLib.Razor.Data; namespace MP.INVE.Data { diff --git a/MP.INVE/_Imports.razor b/MP.INVE/_Imports.razor index 3d19e1a7..c3b591f5 100644 --- a/MP.INVE/_Imports.razor +++ b/MP.INVE/_Imports.razor @@ -9,3 +9,4 @@ @using MP.INVE @using MP.INVE.Shared @using MP.INVE.Components +@using EgwCoreLib.Razor From 1a8ec1f6a85821db4def1c83120b4585ab002ea5 Mon Sep 17 00:00:00 2001 From: "zaccaria.majid" Date: Fri, 3 Feb 2023 12:10:10 +0100 Subject: [PATCH 02/50] porting nuget spec --- MP.SPEC/Components/DataPager.razor | 56 ------ MP.SPEC/Components/DataPager.razor.cs | 198 ---------------------- MP.SPEC/Components/LoadingData.razor | 10 -- MP.SPEC/Components/LoadingDataSmall.razor | 6 - MP.SPEC/Components/ToggleMode.razor | 12 -- MP.SPEC/Components/ToggleMode.razor.cs | 127 -------------- MP.SPEC/MP.SPEC.csproj | 3 +- MP.SPEC/Pages/DOSS.razor.cs | 1 + MP.SPEC/Pages/ODL.razor.cs | 1 + MP.SPEC/Pages/PARAMS.razor.cs | 1 + MP.SPEC/Pages/PODL.razor.cs | 1 + MP.SPEC/Resources/ChangeLog.html | 2 +- MP.SPEC/Resources/VersNum.txt | 2 +- MP.SPEC/Resources/manifest.xml | 2 +- MP.SPEC/_Imports.razor | 1 + 15 files changed, 10 insertions(+), 413 deletions(-) delete mode 100644 MP.SPEC/Components/DataPager.razor delete mode 100644 MP.SPEC/Components/DataPager.razor.cs delete mode 100644 MP.SPEC/Components/LoadingData.razor delete mode 100644 MP.SPEC/Components/LoadingDataSmall.razor delete mode 100644 MP.SPEC/Components/ToggleMode.razor delete mode 100644 MP.SPEC/Components/ToggleMode.razor.cs diff --git a/MP.SPEC/Components/DataPager.razor b/MP.SPEC/Components/DataPager.razor deleted file mode 100644 index 54e6c829..00000000 --- a/MP.SPEC/Components/DataPager.razor +++ /dev/null @@ -1,56 +0,0 @@ -
-
-
-
- @if (totalCount > 0) - { -
    -
  • -
  • - @for (int i = @startPage; i <= endPage; ++i) - { - var pageNum = i; -
  • - } -
  • -
  • -
- } -
-
-
-
- @if (showLoading) - { -
-
-
- } -
-
-
-
-
-
- @if (!showLoading) - { - @totalCount records - } -
-
- @if (totalCount > 0) - { -
- -
- } -
-
-
-
diff --git a/MP.SPEC/Components/DataPager.razor.cs b/MP.SPEC/Components/DataPager.razor.cs deleted file mode 100644 index cf560eb5..00000000 --- a/MP.SPEC/Components/DataPager.razor.cs +++ /dev/null @@ -1,198 +0,0 @@ -using Microsoft.AspNetCore.Components; - -namespace MP.SPEC.Components -{ - public partial class DataPager : ComponentBase - { - #region Public Properties - - [Parameter] - public int currPage - { - get - { - return _numPage; - } - set - { - bool doReport = !_numPage.Equals(value); - if (doReport) - { - _numPage = value; - reportChangePage(); - } - } - } - - [Parameter] - public EventCallback numPageChanged { get; set; } - - [Parameter] - public EventCallback numRecordChanged { get; set; } - - [Parameter] - public int PageSize - { - get - { - return _numRecord; - } - set - { - bool doReport = !_numRecord.Equals(value); - if (doReport) - { - _numRecord = value; - reportChange(); - resetCurrPage(); - } - } - } - - [Parameter] - public bool showLoading - { - get - { - return _showLoading; - } - set - { - if (value) - { - Random random = new Random(); - percLoading = random.Next(30, 90); - } - else - { - percLoading = 5; - } - _showLoading = value; - } - } - - [Parameter] - public int totalCount { get; set; } = 0; - - #endregion Public Properties - - #region Public Methods - - public void resetCurrPage() - { - //await Task.Delay(1); - currPage = 1; - } - - #endregion Public Methods - - #region Protected Fields - - protected bool _showLoading = false; - - #endregion Protected Fields - - #region Protected Properties - - protected int _numPage { get; set; } = 1; - - protected int _numRecord { get; set; } = 10; - - protected int percLoading { get; set; } = 0; - - #endregion Protected Properties - - #region Protected Methods - - protected string cssActive(int numPage) - { - string answ = ""; - if (numPage == currPage) - { - answ = "active"; - } - return answ; - } - - protected override async Task OnInitializedAsync() - { - await Task.Run(() => showLoading = false); - } - - protected void PaginationItemClick(int page) - { - currPage = page; - } - - #endregion Protected Methods - - #region Private Properties - - private int endPage - { - get - { - int answ = (int)(currPage / numPages) * numPages + numPages; - answ = answ < LastPage ? answ : LastPage; - return answ; - } - } - - private int LastPage - { - get - { - return Math.Max((int)Math.Ceiling(totalCount / (double)PageSize), 1); - } - } - - private int nextBlock - { - get - { - int answ = currPage + numPages; - answ = answ < LastPage ? answ : LastPage; - return answ; - } - } - - private int numPages { get; set; } = 10; - - private int prevBlock - { - get - { - int answ = currPage - numPages; - answ = answ > 0 ? answ : 1; - return answ; - } - } - - // calcola un set 1 .. numPages centrato sulla pagina corrente... - private int startPage - { - get - { - int answ = (int)(currPage / numPages) * numPages; - answ = answ > 0 ? answ : 1; - return answ; - } - } - - #endregion Private Properties - - #region Private Methods - - private void reportChange() - { - numRecordChanged.InvokeAsync(PageSize); - } - - private void reportChangePage() - { - numPageChanged.InvokeAsync(currPage); - } - - #endregion Private Methods - } -} \ No newline at end of file diff --git a/MP.SPEC/Components/LoadingData.razor b/MP.SPEC/Components/LoadingData.razor deleted file mode 100644 index 4b160e36..00000000 --- a/MP.SPEC/Components/LoadingData.razor +++ /dev/null @@ -1,10 +0,0 @@ -
-
-

MAPO SPEC

- EgalWare MES suite -
-
-

loading data

- -
-
\ No newline at end of file diff --git a/MP.SPEC/Components/LoadingDataSmall.razor b/MP.SPEC/Components/LoadingDataSmall.razor deleted file mode 100644 index 2217cf02..00000000 --- a/MP.SPEC/Components/LoadingDataSmall.razor +++ /dev/null @@ -1,6 +0,0 @@ -
-
- loading data - -
-
\ No newline at end of file diff --git a/MP.SPEC/Components/ToggleMode.razor b/MP.SPEC/Components/ToggleMode.razor deleted file mode 100644 index 259a0d14..00000000 --- a/MP.SPEC/Components/ToggleMode.razor +++ /dev/null @@ -1,12 +0,0 @@ -
-
- @leftString -
- -
- @rightString -
-
- - - diff --git a/MP.SPEC/Components/ToggleMode.razor.cs b/MP.SPEC/Components/ToggleMode.razor.cs deleted file mode 100644 index c76ef352..00000000 --- a/MP.SPEC/Components/ToggleMode.razor.cs +++ /dev/null @@ -1,127 +0,0 @@ -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 MP.SPEC; -using MP.SPEC.Shared; -using MP.SPEC.Components; -using MP.SPEC.Data; - -namespace MP.SPEC.Components -{ - public partial class ToggleMode - { - [Parameter] - public EventCallback FilterChanged { get; set; } - - [Parameter] - public SelectGlobalToggle SelFilter { get; set; } = new SelectGlobalToggle(); - - protected bool isActive - { - get => SelFilter.isActive; - set - { - if (SelFilter.isActive != value) - { - SelFilter.isActive = value; - reportChange(); - } - } - } - - protected string leftString - { - get => SelFilter.leftString; - set - { - if (SelFilter.leftString != value) - { - SelFilter.leftString = value; - reportChange(); - } - } - } - protected string leftStringCSS - { - get => SelFilter.leftStringCSS; - set - { - if (SelFilter.leftStringCSS != value) - { - SelFilter.leftStringCSS = value; - reportChange(); - } - } - } - protected string rightString - { - get => SelFilter.rightString; - set - { - if (SelFilter.rightString != value) - { - SelFilter.rightString = value; - reportChange(); - } - } - } - protected string rightStringCSS - { - get => SelFilter.rightStringCSS; - set - { - if (SelFilter.rightStringCSS != value) - { - SelFilter.rightStringCSS = value; - reportChange(); - } - } - } - - protected void toggle() - { - var currFilt = SelFilter; - currFilt.isActive = !currFilt.isActive; - SelFilter = currFilt; - if (isActive) - { - rightStringCSS = "fw-bold"; - leftStringCSS = "text-secondary"; - } - else - { - leftStringCSS = "fw-bold"; - rightStringCSS = "text-secondary"; - } - } - protected override async Task OnInitializedAsync() - { - if (isActive) - { - rightStringCSS = "fw-bold"; - leftStringCSS = "text-secondary"; - } - else - { - leftStringCSS = "fw-bold"; - rightStringCSS = "text-secondary"; - } - await FilterChanged.InvokeAsync(SelFilter); - } - - private void reportChange() - { - FilterChanged.InvokeAsync(SelFilter); - } - } -} \ No newline at end of file diff --git a/MP.SPEC/MP.SPEC.csproj b/MP.SPEC/MP.SPEC.csproj index 0214db77..75e4df38 100644 --- a/MP.SPEC/MP.SPEC.csproj +++ b/MP.SPEC/MP.SPEC.csproj @@ -5,7 +5,7 @@ enable enable MP.SPEC - 6.16.2212.2211 + 6.16.2302.311 @@ -29,6 +29,7 @@ + diff --git a/MP.SPEC/Pages/DOSS.razor.cs b/MP.SPEC/Pages/DOSS.razor.cs index db3034d7..817626ca 100644 --- a/MP.SPEC/Pages/DOSS.razor.cs +++ b/MP.SPEC/Pages/DOSS.razor.cs @@ -3,6 +3,7 @@ using Microsoft.JSInterop; using MP.Data.DatabaseModels; using MP.SPEC.Components; using MP.SPEC.Data; +using EgwCoreLib.Razor; namespace MP.SPEC.Pages { diff --git a/MP.SPEC/Pages/ODL.razor.cs b/MP.SPEC/Pages/ODL.razor.cs index eff6487f..63854927 100644 --- a/MP.SPEC/Pages/ODL.razor.cs +++ b/MP.SPEC/Pages/ODL.razor.cs @@ -4,6 +4,7 @@ using Microsoft.JSInterop; using MP.Data.DatabaseModels; using MP.SPEC.Components; using MP.SPEC.Data; +using EgwCoreLib.Razor; namespace MP.SPEC.Pages { diff --git a/MP.SPEC/Pages/PARAMS.razor.cs b/MP.SPEC/Pages/PARAMS.razor.cs index e4c1cdcb..a77d5396 100644 --- a/MP.SPEC/Pages/PARAMS.razor.cs +++ b/MP.SPEC/Pages/PARAMS.razor.cs @@ -3,6 +3,7 @@ using MP.Data.DatabaseModels; using MP.SPEC.Components; using MP.SPEC.Data; using NLog; +using EgwCoreLib.Razor; namespace MP.SPEC.Pages { diff --git a/MP.SPEC/Pages/PODL.razor.cs b/MP.SPEC/Pages/PODL.razor.cs index d4a0cf7f..cf8fe54f 100644 --- a/MP.SPEC/Pages/PODL.razor.cs +++ b/MP.SPEC/Pages/PODL.razor.cs @@ -7,6 +7,7 @@ using MP.SPEC.Data; using MP.SPEC.Services; using NLog; using System.Reflection.PortableExecutable; +using EgwCoreLib.Razor; namespace MP.SPEC.Pages { diff --git a/MP.SPEC/Resources/ChangeLog.html b/MP.SPEC/Resources/ChangeLog.html index 36d2458d..dc049833 100644 --- a/MP.SPEC/Resources/ChangeLog.html +++ b/MP.SPEC/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo MAPOSPEC -

Versione: 6.16.2212.2211

+

Versione: 6.16.2302.311


Note di rilascio:
  • diff --git a/MP.SPEC/Resources/VersNum.txt b/MP.SPEC/Resources/VersNum.txt index b7981b6d..7b84596c 100644 --- a/MP.SPEC/Resources/VersNum.txt +++ b/MP.SPEC/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2212.2211 +6.16.2302.311 diff --git a/MP.SPEC/Resources/manifest.xml b/MP.SPEC/Resources/manifest.xml index 9f6760a8..658dd099 100644 --- a/MP.SPEC/Resources/manifest.xml +++ b/MP.SPEC/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2212.2211 + 6.16.2302.311 https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/MP.SPEC.zip https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/ChangeLog.html false diff --git a/MP.SPEC/_Imports.razor b/MP.SPEC/_Imports.razor index c52656d3..944f4f17 100644 --- a/MP.SPEC/_Imports.razor +++ b/MP.SPEC/_Imports.razor @@ -9,3 +9,4 @@ @using MP.SPEC @using MP.SPEC.Shared @using MP.SPEC.Components +@using EgwCoreLib.Razor From 72739efbde1b33436290020950ad9941506518d3 Mon Sep 17 00:00:00 2001 From: "zaccaria.majid" Date: Fri, 3 Feb 2023 12:10:18 +0100 Subject: [PATCH 03/50] porting nuget stats --- MP.Stats/Components/DataPager.razor | 67 -------- MP.Stats/Components/DataPager.razor.cs | 225 ------------------------- MP.Stats/Components/LoadingData.razor | 6 - MP.Stats/MP.Stats.csproj | 3 +- MP.Stats/Resources/ChangeLog.html | 2 +- MP.Stats/Resources/VersNum.txt | 2 +- MP.Stats/Resources/manifest.xml | 2 +- MP.Stats/_Imports.razor | 3 +- 8 files changed, 7 insertions(+), 303 deletions(-) delete mode 100644 MP.Stats/Components/DataPager.razor delete mode 100644 MP.Stats/Components/DataPager.razor.cs delete mode 100644 MP.Stats/Components/LoadingData.razor diff --git a/MP.Stats/Components/DataPager.razor b/MP.Stats/Components/DataPager.razor deleted file mode 100644 index 880d9136..00000000 --- a/MP.Stats/Components/DataPager.razor +++ /dev/null @@ -1,67 +0,0 @@ -
    -
    -
    -
    - @if (totalCount > 0) - { -
      -
    • -
    • - @for (int i = @startPage; i <= endPage; ++i) - { - var pageNum = i; -
    • - } -
    • -
    • -
    - } -
    -
    -
    -
    - @if (showLoading) - { -
    -
    -
    - } -
    -
    -
    -
    -
    -
    - @if (!showLoading) - { - @totalCount records - } - @if (totalCount > 0) - { - if (!fileExist) - { - - } - else - { - Download Data - } - } -
    -
    - @if (totalCount > 0) - { -
    - -
    - } -
    -
    -
    -
    \ No newline at end of file diff --git a/MP.Stats/Components/DataPager.razor.cs b/MP.Stats/Components/DataPager.razor.cs deleted file mode 100644 index 0d6d8dcc..00000000 --- a/MP.Stats/Components/DataPager.razor.cs +++ /dev/null @@ -1,225 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Components; -using MP.Stats.Components; -using MP.Stats.Data; - -namespace MP.Stats.Components -{ - public partial class DataPager : ComponentBase - { - #region Protected Fields - - protected bool _showLoading = false; - - protected string exportDir = $"{Directory.GetCurrentDirectory()}\\temp"; - - - #endregion Protected Fields - - #region Private Properties - - private int endPage - { - get - { - int answ = (int)(currPage / numPages) * numPages + numPages; - answ = answ < LastPage ? answ : LastPage; - return answ; - } - } - - private int LastPage - { - get - { - return Math.Max((int)Math.Ceiling(totalCount / (double)PageSize), 1); - } - } - - private int nextBlock - { - get - { - int answ = currPage + numPages; - answ = answ < LastPage ? answ : LastPage; - return answ; - } - } - - private int numPages { get; set; } = 10; - - private int prevBlock - { - get - { - int answ = currPage - numPages; - answ = answ > 0 ? answ : 1; - return answ; - } - } - - // calcola un set 1 .. numPages centrato sulla pagina corrente... - private int startPage - { - get - { - int answ = (int)(currPage / numPages) * numPages; - answ = answ > 0 ? answ : 1; - return answ; - } - } - - #endregion Private Properties - - #region Protected Properties - - protected int _numPage { get; set; } = 1; - - protected int _numRecord { get; set; } = 10; - - protected bool fileExist - { - get - { - return File.Exists(fullPath); - } - } - - protected string fullPath - { - get => $"{exportDir}\\{fileName}"; - } - - protected int percLoading { get; set; } = 0; - - #endregion Protected Properties - - #region Public Properties - - [Parameter] - public int currPage - { - get - { - return _numPage; - } - set - { - bool doReport = !_numPage.Equals(value); - if (doReport) - { - _numPage = value; - reportChangePage(); - } - } - } - - [Parameter] - public EventCallback exportRequested { get; set; } - - [Parameter] - public string fileName { get; set; } - - [Parameter] - public EventCallback numPageChanged { get; set; } - - [Parameter] - public EventCallback numRecordChanged { get; set; } - - [Parameter] - public int PageSize - { - get - { - return _numRecord; - } - set - { - bool doReport = !_numRecord.Equals(value); - if (doReport) - { - _numRecord = value; - reportChange(); - } - } - } - - [Parameter] - public bool showLoading - { - get - { - return _showLoading; - } - set - { - if (value) - { - Random random = new Random(); - percLoading = random.Next(30, 90); - } - else - { - percLoading = 5; - } - _showLoading = value; - } - } - - [Parameter] - public int totalCount { get; set; } = 0; - - #endregion Public Properties - - #region Private Methods - - private void reportChange() - { - numRecordChanged.InvokeAsync(PageSize); - } - - private void reportChangePage() - { - numPageChanged.InvokeAsync(currPage); - } - - private async Task requestSave() - { - showLoading = true; - await Task.Delay(1); - await exportRequested.InvokeAsync(currPage); - showLoading = false; - } - - - #endregion Private Methods - - #region Protected Methods - - protected string cssActive(int numPage) - { - string answ = ""; - if (numPage == currPage) - { - answ = "active"; - } - return answ; - } - - protected override async Task OnInitializedAsync() - { - await Task.Run(() => showLoading = false); - } - - protected void PaginationItemClick(int page) - { - currPage = page; - } - - #endregion Protected Methods - } -} \ No newline at end of file diff --git a/MP.Stats/Components/LoadingData.razor b/MP.Stats/Components/LoadingData.razor deleted file mode 100644 index d3228baf..00000000 --- a/MP.Stats/Components/LoadingData.razor +++ /dev/null @@ -1,6 +0,0 @@ -
    -
    -

    loading data

    - -
    -
    \ No newline at end of file diff --git a/MP.Stats/MP.Stats.csproj b/MP.Stats/MP.Stats.csproj index 39ac2560..434e520d 100644 --- a/MP.Stats/MP.Stats.csproj +++ b/MP.Stats/MP.Stats.csproj @@ -4,7 +4,7 @@ net6.0 MP.Stats 826e877c-ba70-4253-84cb-d0b1cafd4440 - 6.16.2211.1517 + 6.16.2302.0312 @@ -185,6 +185,7 @@ + diff --git a/MP.Stats/Resources/ChangeLog.html b/MP.Stats/Resources/ChangeLog.html index 5e47116b..c2796670 100644 --- a/MP.Stats/Resources/ChangeLog.html +++ b/MP.Stats/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo statistiche MAPO -

    Versione: 6.16.2211.1517

    +

    Versione: 6.16.2302.0312


    Note di rilascio:
      diff --git a/MP.Stats/Resources/VersNum.txt b/MP.Stats/Resources/VersNum.txt index b5d4a429..7f8e6acc 100644 --- a/MP.Stats/Resources/VersNum.txt +++ b/MP.Stats/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2211.1517 +6.16.2302.0312 diff --git a/MP.Stats/Resources/manifest.xml b/MP.Stats/Resources/manifest.xml index 920440d2..c154b2a2 100644 --- a/MP.Stats/Resources/manifest.xml +++ b/MP.Stats/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2211.1517 + 6.16.2302.0312 https://nexus.steamware.net/repository/SWS/MP-STATS/stable/LAST/MP.Stats.zip https://nexus.steamware.net/repository/SWS/MP-STATS/stable/LAST/ChangeLog.html false diff --git a/MP.Stats/_Imports.razor b/MP.Stats/_Imports.razor index 5527ce16..d83ba1e6 100644 --- a/MP.Stats/_Imports.razor +++ b/MP.Stats/_Imports.razor @@ -7,4 +7,5 @@ @using Microsoft.AspNetCore.Components.Web.Virtualization @using Microsoft.JSInterop @using MP.Stats -@using MP.Stats.Shared \ No newline at end of file +@using MP.Stats.Shared +@using EgwCoreLib.Razor \ No newline at end of file From 088caf1d790da6bbb0845d8f2be39ac9e06f0a85 Mon Sep 17 00:00:00 2001 From: "zaccaria.majid" Date: Fri, 3 Feb 2023 12:32:14 +0100 Subject: [PATCH 04/50] prova fix --- MP.INVE/MP.INVE.csproj | 4 ++-- MP.INVE/Pages/ElencoMagazzini.razor.cs | 1 + MP.INVE/Resources/ChangeLog.html | 2 +- MP.INVE/Resources/VersNum.txt | 2 +- MP.INVE/Resources/manifest.xml | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/MP.INVE/MP.INVE.csproj b/MP.INVE/MP.INVE.csproj index 99964c74..804961ba 100644 --- a/MP.INVE/MP.INVE.csproj +++ b/MP.INVE/MP.INVE.csproj @@ -5,7 +5,7 @@ enable enable MP.INVE - 6.16.2301.315 + 6.16.2302.312 @@ -19,12 +19,12 @@ + - diff --git a/MP.INVE/Pages/ElencoMagazzini.razor.cs b/MP.INVE/Pages/ElencoMagazzini.razor.cs index f59742f5..9f7c2aad 100644 --- a/MP.INVE/Pages/ElencoMagazzini.razor.cs +++ b/MP.INVE/Pages/ElencoMagazzini.razor.cs @@ -19,6 +19,7 @@ using MP.Data.DTO; using MP.INVE.Data; using Blazored.LocalStorage; using MP.Data.DatabaseModels; +using EgwCoreLib.Razor; namespace MP.INVE.Pages { diff --git a/MP.INVE/Resources/ChangeLog.html b/MP.INVE/Resources/ChangeLog.html index fb2eb664..61133f72 100644 --- a/MP.INVE/Resources/ChangeLog.html +++ b/MP.INVE/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo MAPOINVE -

      Versione: 6.16.2301.315

      +

      Versione: 6.16.2302.312


      Note di rilascio:
      • diff --git a/MP.INVE/Resources/VersNum.txt b/MP.INVE/Resources/VersNum.txt index 252ed205..c23401eb 100644 --- a/MP.INVE/Resources/VersNum.txt +++ b/MP.INVE/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2301.315 +6.16.2302.312 diff --git a/MP.INVE/Resources/manifest.xml b/MP.INVE/Resources/manifest.xml index dcc77121..93f5270b 100644 --- a/MP.INVE/Resources/manifest.xml +++ b/MP.INVE/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2301.315 + 6.16.2302.312 https://nexus.steamware.net/repository/SWS/MP-INVE/stable/LAST/MP.INVE.zip https://nexus.steamware.net/repository/SWS/MP-INVE/stable/LAST/ChangeLog.html false From a99a208a3feac468ac356f138816497561d10307 Mon Sep 17 00:00:00 2001 From: "zaccaria.majid" Date: Fri, 3 Feb 2023 12:35:30 +0100 Subject: [PATCH 05/50] refresh versioni --- MP.SPEC/MP.SPEC.csproj | 2 +- MP.SPEC/Resources/ChangeLog.html | 2 +- MP.SPEC/Resources/VersNum.txt | 2 +- MP.SPEC/Resources/manifest.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/MP.SPEC/MP.SPEC.csproj b/MP.SPEC/MP.SPEC.csproj index 75e4df38..7725b631 100644 --- a/MP.SPEC/MP.SPEC.csproj +++ b/MP.SPEC/MP.SPEC.csproj @@ -5,7 +5,7 @@ enable enable MP.SPEC - 6.16.2302.311 + 6.16.2302.312 diff --git a/MP.SPEC/Resources/ChangeLog.html b/MP.SPEC/Resources/ChangeLog.html index dc049833..dc3cf7fa 100644 --- a/MP.SPEC/Resources/ChangeLog.html +++ b/MP.SPEC/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo MAPOSPEC -

        Versione: 6.16.2302.311

        +

        Versione: 6.16.2302.312


        Note di rilascio:
        • diff --git a/MP.SPEC/Resources/VersNum.txt b/MP.SPEC/Resources/VersNum.txt index 7b84596c..c23401eb 100644 --- a/MP.SPEC/Resources/VersNum.txt +++ b/MP.SPEC/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2302.311 +6.16.2302.312 diff --git a/MP.SPEC/Resources/manifest.xml b/MP.SPEC/Resources/manifest.xml index 658dd099..3d4c50ce 100644 --- a/MP.SPEC/Resources/manifest.xml +++ b/MP.SPEC/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2302.311 + 6.16.2302.312 https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/MP.SPEC.zip https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/ChangeLog.html false From 7025b803834bed2b22aac7f2d5c1e123b6d677e9 Mon Sep 17 00:00:00 2001 From: "zaccaria.majid" Date: Fri, 3 Feb 2023 14:47:11 +0100 Subject: [PATCH 06/50] refresh nuget --- MP.SPEC/MP.SPEC.csproj | 2 +- MP.SPEC/Pages/ODL.razor | 2 +- MP.SPEC/Pages/ODL.razor.cs | 3 +-- MP.SPEC/Resources/ChangeLog.html | 2 +- MP.SPEC/Resources/VersNum.txt | 2 +- MP.SPEC/Resources/manifest.xml | 2 +- 6 files changed, 6 insertions(+), 7 deletions(-) diff --git a/MP.SPEC/MP.SPEC.csproj b/MP.SPEC/MP.SPEC.csproj index 7725b631..c0d48242 100644 --- a/MP.SPEC/MP.SPEC.csproj +++ b/MP.SPEC/MP.SPEC.csproj @@ -5,7 +5,7 @@ enable enable MP.SPEC - 6.16.2302.312 + 6.16.2302.314 diff --git a/MP.SPEC/Pages/ODL.razor b/MP.SPEC/Pages/ODL.razor index 1a3d524b..27d75165 100644 --- a/MP.SPEC/Pages/ODL.razor +++ b/MP.SPEC/Pages/ODL.razor @@ -58,7 +58,7 @@ diff --git a/MP.SPEC/Pages/ODL.razor.cs b/MP.SPEC/Pages/ODL.razor.cs index 63854927..0c30854e 100644 --- a/MP.SPEC/Pages/ODL.razor.cs +++ b/MP.SPEC/Pages/ODL.razor.cs @@ -1,10 +1,9 @@ using Blazored.LocalStorage; +using EgwCoreLib.Razor; using Microsoft.AspNetCore.Components; using Microsoft.JSInterop; using MP.Data.DatabaseModels; -using MP.SPEC.Components; using MP.SPEC.Data; -using EgwCoreLib.Razor; namespace MP.SPEC.Pages { diff --git a/MP.SPEC/Resources/ChangeLog.html b/MP.SPEC/Resources/ChangeLog.html index dc3cf7fa..4ff9c29c 100644 --- a/MP.SPEC/Resources/ChangeLog.html +++ b/MP.SPEC/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo MAPOSPEC -

          Versione: 6.16.2302.312

          +

          Versione: 6.16.2302.314


          Note di rilascio:
          • diff --git a/MP.SPEC/Resources/VersNum.txt b/MP.SPEC/Resources/VersNum.txt index c23401eb..6a225c38 100644 --- a/MP.SPEC/Resources/VersNum.txt +++ b/MP.SPEC/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2302.312 +6.16.2302.314 diff --git a/MP.SPEC/Resources/manifest.xml b/MP.SPEC/Resources/manifest.xml index 3d4c50ce..f790e435 100644 --- a/MP.SPEC/Resources/manifest.xml +++ b/MP.SPEC/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2302.312 + 6.16.2302.314 https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/MP.SPEC.zip https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/ChangeLog.html false From ef61875d9434d106554934b9a4f4c93f1f95a49a Mon Sep 17 00:00:00 2001 From: "zaccaria.majid" Date: Fri, 3 Feb 2023 14:55:23 +0100 Subject: [PATCH 07/50] aggiornato pacchetto nuget spec --- MP.SPEC/MP.SPEC.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MP.SPEC/MP.SPEC.csproj b/MP.SPEC/MP.SPEC.csproj index c0d48242..2008644a 100644 --- a/MP.SPEC/MP.SPEC.csproj +++ b/MP.SPEC/MP.SPEC.csproj @@ -29,7 +29,7 @@ - + From 658e1801f77c6a66cf672825070fac4c165101fc Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Fri, 3 Feb 2023 15:02:53 +0100 Subject: [PATCH 08/50] Minor fix --- MP.INVE/Shared/NavMenu.razor | 22 ---------------------- MP.SPEC/Components/CmpFooter.razor.cs | 2 +- 2 files changed, 1 insertion(+), 23 deletions(-) diff --git a/MP.INVE/Shared/NavMenu.razor b/MP.INVE/Shared/NavMenu.razor index 8675e92e..c1196200 100644 --- a/MP.INVE/Shared/NavMenu.razor +++ b/MP.INVE/Shared/NavMenu.razor @@ -73,28 +73,6 @@ - @* *@ - @**@ } - - diff --git a/MP.SPEC/Components/CmpFooter.razor.cs b/MP.SPEC/Components/CmpFooter.razor.cs index f58b1fe0..45a9cccf 100644 --- a/MP.SPEC/Components/CmpFooter.razor.cs +++ b/MP.SPEC/Components/CmpFooter.razor.cs @@ -2,7 +2,7 @@ using NLog; namespace MP.SPEC.Components { - public partial class CmpFooter + public partial class CmpFooter : IDisposable { #region Public Methods From 197e17d4e8109b86e8f24886945311c0d9fada26 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Fri, 3 Feb 2023 15:02:57 +0100 Subject: [PATCH 09/50] refresh --- MP.SPEC/MP.SPEC.csproj | 2 +- MP.SPEC/Resources/ChangeLog.html | 2 +- MP.SPEC/Resources/VersNum.txt | 2 +- MP.SPEC/Resources/manifest.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/MP.SPEC/MP.SPEC.csproj b/MP.SPEC/MP.SPEC.csproj index 0214db77..2aa02615 100644 --- a/MP.SPEC/MP.SPEC.csproj +++ b/MP.SPEC/MP.SPEC.csproj @@ -5,7 +5,7 @@ enable enable MP.SPEC - 6.16.2212.2211 + 6.16.2301.2414 diff --git a/MP.SPEC/Resources/ChangeLog.html b/MP.SPEC/Resources/ChangeLog.html index 36d2458d..0390710b 100644 --- a/MP.SPEC/Resources/ChangeLog.html +++ b/MP.SPEC/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo MAPOSPEC -

            Versione: 6.16.2212.2211

            +

            Versione: 6.16.2301.2414


            Note di rilascio:
            • diff --git a/MP.SPEC/Resources/VersNum.txt b/MP.SPEC/Resources/VersNum.txt index b7981b6d..c832e443 100644 --- a/MP.SPEC/Resources/VersNum.txt +++ b/MP.SPEC/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2212.2211 +6.16.2301.2414 diff --git a/MP.SPEC/Resources/manifest.xml b/MP.SPEC/Resources/manifest.xml index 9f6760a8..1b9f5349 100644 --- a/MP.SPEC/Resources/manifest.xml +++ b/MP.SPEC/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2212.2211 + 6.16.2301.2414 https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/MP.SPEC.zip https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/ChangeLog.html false From 4ea23a866705235063b3d51e44ad7c5a2fdecba9 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Fri, 3 Feb 2023 15:07:30 +0100 Subject: [PATCH 10/50] Refresh SPEC --- MP.Data/MP.Data.csproj | 4 ++-- MP.SPEC/MP.SPEC.csproj | 8 ++++---- MP.SPEC/Resources/ChangeLog.html | 2 +- MP.SPEC/Resources/VersNum.txt | 2 +- MP.SPEC/Resources/manifest.xml | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/MP.Data/MP.Data.csproj b/MP.Data/MP.Data.csproj index ce53566c..586f068a 100644 --- a/MP.Data/MP.Data.csproj +++ b/MP.Data/MP.Data.csproj @@ -16,7 +16,7 @@ - + @@ -25,6 +25,6 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - + \ No newline at end of file diff --git a/MP.SPEC/MP.SPEC.csproj b/MP.SPEC/MP.SPEC.csproj index d8228754..73835cae 100644 --- a/MP.SPEC/MP.SPEC.csproj +++ b/MP.SPEC/MP.SPEC.csproj @@ -5,7 +5,7 @@ enable enable MP.SPEC - 6.16.2301.2414 + 6.16.2302.315 @@ -27,11 +27,11 @@ - - + + - + diff --git a/MP.SPEC/Resources/ChangeLog.html b/MP.SPEC/Resources/ChangeLog.html index 0390710b..d5e65297 100644 --- a/MP.SPEC/Resources/ChangeLog.html +++ b/MP.SPEC/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo MAPOSPEC -

              Versione: 6.16.2301.2414

              +

              Versione: 6.16.2302.315


              Note di rilascio:
              • diff --git a/MP.SPEC/Resources/VersNum.txt b/MP.SPEC/Resources/VersNum.txt index c832e443..0e6993b1 100644 --- a/MP.SPEC/Resources/VersNum.txt +++ b/MP.SPEC/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2301.2414 +6.16.2302.315 diff --git a/MP.SPEC/Resources/manifest.xml b/MP.SPEC/Resources/manifest.xml index 1b9f5349..2276dbd6 100644 --- a/MP.SPEC/Resources/manifest.xml +++ b/MP.SPEC/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2301.2414 + 6.16.2302.315 https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/MP.SPEC.zip https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/ChangeLog.html false From 0e6378fc6ce109cbb5fdf12f24c6da9e6f99fb25 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Fri, 3 Feb 2023 15:08:10 +0100 Subject: [PATCH 11/50] Rimosso stage test da CiCd --- .gitlab-ci.yml | 212 ++++++++++++++++++++++++------------------------- 1 file changed, 106 insertions(+), 106 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e57d12c6..0babac99 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -65,7 +65,7 @@ variables: # Stages previsti stages: - build - - test +# - test - deploy - installer - release @@ -175,69 +175,69 @@ CONF:build: # script: # - dotnet build $env:PROJ_PATH/$env:APP_NAME.csproj -LAND:test: - stage: test - tags: - - win - variables: - APP_NAME: MP.Land - SOL_NAME: MP-LAND - before_script: - - *nuget-fix - - dotnet restore "$env:SOL_NAME.sln" - only: - - develop - needs: ["LAND:build"] - script: - - dotnet test $env:APP_NAME/$env:APP_NAME.csproj +# LAND:test: +# stage: test +# tags: +# - win +# variables: +# APP_NAME: MP.Land +# SOL_NAME: MP-LAND +# before_script: +# - *nuget-fix +# - dotnet restore "$env:SOL_NAME.sln" +# only: +# - develop +# needs: ["LAND:build"] +# script: +# - dotnet test $env:APP_NAME/$env:APP_NAME.csproj -PROG:test: - stage: test - tags: - - win - variables: - APP_NAME: MP.Prog - SOL_NAME: MP-PROG - before_script: - - *nuget-fix - - dotnet restore "$env:SOL_NAME.sln" - only: - - develop - needs: ["PROG:build"] - script: - - dotnet test $env:APP_NAME/$env:APP_NAME.csproj +# PROG:test: +# stage: test +# tags: +# - win +# variables: +# APP_NAME: MP.Prog +# SOL_NAME: MP-PROG +# before_script: +# - *nuget-fix +# - dotnet restore "$env:SOL_NAME.sln" +# only: +# - develop +# needs: ["PROG:build"] +# script: +# - dotnet test $env:APP_NAME/$env:APP_NAME.csproj -STAT:test: - stage: test - tags: - - win - variables: - APP_NAME: MP.Stats - SOL_NAME: MP-STATS - before_script: - - *nuget-fix - - dotnet restore "$env:SOL_NAME.sln" - only: - - develop - needs: ["STAT:build"] - script: - - dotnet test $env:APP_NAME/$env:APP_NAME.csproj +# STAT:test: +# stage: test +# tags: +# - win +# variables: +# APP_NAME: MP.Stats +# SOL_NAME: MP-STATS +# before_script: +# - *nuget-fix +# - dotnet restore "$env:SOL_NAME.sln" +# only: +# - develop +# needs: ["STAT:build"] +# script: +# - dotnet test $env:APP_NAME/$env:APP_NAME.csproj -MON:test: - stage: test - tags: - - win - variables: - APP_NAME: MP.Mon - SOL_NAME: MP-MON - before_script: - - *nuget-fix - - dotnet restore "$env:SOL_NAME.sln" - only: - - develop - needs: ["MON:build"] - script: - - dotnet test $env:APP_NAME/$env:APP_NAME.csproj +# MON:test: +# stage: test +# tags: +# - win +# variables: +# APP_NAME: MP.Mon +# SOL_NAME: MP-MON +# before_script: +# - *nuget-fix +# - dotnet restore "$env:SOL_NAME.sln" +# only: +# - develop +# needs: ["MON:build"] +# script: +# - dotnet test $env:APP_NAME/$env:APP_NAME.csproj # WAMON:test: # stage: test @@ -256,53 +256,53 @@ MON:test: # script: # - dotnet test $env:PROJ_PATH/$env:APP_NAME.csproj -SPEC:test: - stage: test - tags: - - win - variables: - APP_NAME: MP.SPEC - SOL_NAME: MP-SPEC - before_script: - - *nuget-fix - - dotnet restore "$env:SOL_NAME.sln" - only: - - develop - needs: ["SPEC:build"] - script: - - dotnet test $env:APP_NAME/$env:APP_NAME.csproj +# SPEC:test: +# stage: test +# tags: +# - win +# variables: +# APP_NAME: MP.SPEC +# SOL_NAME: MP-SPEC +# before_script: +# - *nuget-fix +# - dotnet restore "$env:SOL_NAME.sln" +# only: +# - develop +# needs: ["SPEC:build"] +# script: +# - dotnet test $env:APP_NAME/$env:APP_NAME.csproj -INVE:test: - stage: test - tags: - - win - variables: - APP_NAME: MP.INVE - SOL_NAME: MP-INVE - before_script: - - *nuget-fix - - dotnet restore "$env:SOL_NAME.sln" - only: - - develop - needs: ["INVE:build"] - script: - - dotnet test $env:APP_NAME/$env:APP_NAME.csproj +# INVE:test: +# stage: test +# tags: +# - win +# variables: +# APP_NAME: MP.INVE +# SOL_NAME: MP-INVE +# before_script: +# - *nuget-fix +# - dotnet restore "$env:SOL_NAME.sln" +# only: +# - develop +# needs: ["INVE:build"] +# script: +# - dotnet test $env:APP_NAME/$env:APP_NAME.csproj -CONF:test: - stage: test - tags: - - win - variables: - APP_NAME: IobConf.UI - SOL_NAME: IobConf - before_script: - - *nuget-fix - - dotnet restore "$env:SOL_NAME.sln" - only: - - develop - needs: ["CONF:build"] - script: - - dotnet test $env:APP_NAME/$env:APP_NAME.csproj +# CONF:test: +# stage: test +# tags: +# - win +# variables: +# APP_NAME: IobConf.UI +# SOL_NAME: IobConf +# before_script: +# - *nuget-fix +# - dotnet restore "$env:SOL_NAME.sln" +# only: +# - develop +# needs: ["CONF:build"] +# script: +# - dotnet test $env:APP_NAME/$env:APP_NAME.csproj LAND:IIS01:deploy: stage: deploy From c5658d6ea32221f3b9ce1963e8994eb45d07249e Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Fri, 3 Feb 2023 15:09:11 +0100 Subject: [PATCH 12/50] fix yaml --- .gitlab-ci.yml | 157 +++---------------------------------------------- 1 file changed, 7 insertions(+), 150 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0babac99..b27e6268 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -65,7 +65,6 @@ variables: # Stages previsti stages: - build -# - test - deploy - installer - release @@ -161,148 +160,6 @@ CONF:build: script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj -# WAMON:build: -# stage: build -# tags: -# - win -# variables: -# PROJ_PATH: MP.WASM.Mon\Server -# APP_NAME: MP.WASM.Mon.Server -# SOL_NAME: MP-WAMON -# before_script: -# - *nuget-fix -# - dotnet restore "$env:SOL_NAME.sln" -# script: -# - dotnet build $env:PROJ_PATH/$env:APP_NAME.csproj - -# LAND:test: -# stage: test -# tags: -# - win -# variables: -# APP_NAME: MP.Land -# SOL_NAME: MP-LAND -# before_script: -# - *nuget-fix -# - dotnet restore "$env:SOL_NAME.sln" -# only: -# - develop -# needs: ["LAND:build"] -# script: -# - dotnet test $env:APP_NAME/$env:APP_NAME.csproj - -# PROG:test: -# stage: test -# tags: -# - win -# variables: -# APP_NAME: MP.Prog -# SOL_NAME: MP-PROG -# before_script: -# - *nuget-fix -# - dotnet restore "$env:SOL_NAME.sln" -# only: -# - develop -# needs: ["PROG:build"] -# script: -# - dotnet test $env:APP_NAME/$env:APP_NAME.csproj - -# STAT:test: -# stage: test -# tags: -# - win -# variables: -# APP_NAME: MP.Stats -# SOL_NAME: MP-STATS -# before_script: -# - *nuget-fix -# - dotnet restore "$env:SOL_NAME.sln" -# only: -# - develop -# needs: ["STAT:build"] -# script: -# - dotnet test $env:APP_NAME/$env:APP_NAME.csproj - -# MON:test: -# stage: test -# tags: -# - win -# variables: -# APP_NAME: MP.Mon -# SOL_NAME: MP-MON -# before_script: -# - *nuget-fix -# - dotnet restore "$env:SOL_NAME.sln" -# only: -# - develop -# needs: ["MON:build"] -# script: -# - dotnet test $env:APP_NAME/$env:APP_NAME.csproj - -# WAMON:test: -# stage: test -# tags: -# - win -# variables: -# PROJ_PATH: MP.WASM.Mon\Server -# APP_NAME: MP.WASM.Mon.Server -# SOL_NAME: MP-WAMON -# before_script: -# - *nuget-fix -# - dotnet restore "$env:SOL_NAME.sln" -# only: -# - develop -# needs: ["WAMON:build"] -# script: -# - dotnet test $env:PROJ_PATH/$env:APP_NAME.csproj - -# SPEC:test: -# stage: test -# tags: -# - win -# variables: -# APP_NAME: MP.SPEC -# SOL_NAME: MP-SPEC -# before_script: -# - *nuget-fix -# - dotnet restore "$env:SOL_NAME.sln" -# only: -# - develop -# needs: ["SPEC:build"] -# script: -# - dotnet test $env:APP_NAME/$env:APP_NAME.csproj - -# INVE:test: -# stage: test -# tags: -# - win -# variables: -# APP_NAME: MP.INVE -# SOL_NAME: MP-INVE -# before_script: -# - *nuget-fix -# - dotnet restore "$env:SOL_NAME.sln" -# only: -# - develop -# needs: ["INVE:build"] -# script: -# - dotnet test $env:APP_NAME/$env:APP_NAME.csproj - -# CONF:test: -# stage: test -# tags: -# - win -# variables: -# APP_NAME: IobConf.UI -# SOL_NAME: IobConf -# before_script: -# - *nuget-fix -# - dotnet restore "$env:SOL_NAME.sln" -# only: -# - develop -# needs: ["CONF:build"] -# script: -# - dotnet test $env:APP_NAME/$env:APP_NAME.csproj LAND:IIS01:deploy: stage: deploy @@ -316,7 +173,7 @@ LAND:IIS01:deploy: - dotnet restore "$env:SOL_NAME.sln" only: - develop - needs: ["LAND:test"] + needs: ["LAND:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj @@ -333,7 +190,7 @@ PROG:IIS01:deploy: - dotnet restore "$env:SOL_NAME.sln" only: - develop - needs: ["PROG:test"] + needs: ["PROG:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj @@ -350,7 +207,7 @@ STAT:IIS01:deploy: - dotnet restore "$env:SOL_NAME.sln" only: - develop - needs: ["STAT:test"] + needs: ["STAT:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj @@ -367,7 +224,7 @@ MON:IIS01:deploy: - dotnet restore "$env:SOL_NAME.sln" only: - develop - needs: ["MON:test"] + needs: ["MON:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj @@ -384,7 +241,7 @@ SPEC:IIS01:deploy: - dotnet restore "$env:SOL_NAME.sln" only: - develop - needs: ["SPEC:test"] + needs: ["SPEC:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj @@ -401,7 +258,7 @@ INVE:IIS01:deploy: - dotnet restore "$env:SOL_NAME.sln" only: - develop - needs: ["INVE:test"] + needs: ["INVE:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj @@ -418,7 +275,7 @@ CONF:IIS01:deploy: - dotnet restore "$env:SOL_NAME.sln" only: - develop - needs: ["CONF:test"] + needs: ["CONF:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj From 2a83497ae65a99491477878af0c2e01aa06bec70 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Fri, 3 Feb 2023 15:22:50 +0100 Subject: [PATCH 13/50] update pacchetto x SPEC --- MP.SPEC/MP.SPEC.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MP.SPEC/MP.SPEC.csproj b/MP.SPEC/MP.SPEC.csproj index 73835cae..f6142ab5 100644 --- a/MP.SPEC/MP.SPEC.csproj +++ b/MP.SPEC/MP.SPEC.csproj @@ -29,7 +29,7 @@ - + From 37c650a366c446a37e54c383d04fd675c893095c Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Fri, 3 Feb 2023 15:24:17 +0100 Subject: [PATCH 14/50] fix sorgenti nuget x yaml --- .gitlab-ci.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b27e6268..feb4e24f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -21,6 +21,14 @@ variables: if (! [String]::IsNullOrWhiteSpace($hasSource)) { dotnet nuget remove source nexus-proxy-v3 } + $hasSource = dotnet nuget list source | Select-String -Pattern "Microsoft Visual Studio Offline Packages" + if (! [String]::IsNullOrWhiteSpace($hasSource)) { + dotnet nuget remove source 'Microsoft Visual Studio Offline Packages' + } + $hasSource = dotnet nuget list source | Select-String -Pattern "nuget.org" + if (! [String]::IsNullOrWhiteSpace($hasSource)) { + dotnet nuget remove source nuget.org + } dotnet nuget add source https://nexus.steamware.net/repository/nuget-proxy-v3/index.json -n nexus-proxy-v3 -u nugetUser -p viaDante16 --store-password-in-clear-text echo "Has Source: $hasSource" From 7533b60c291531298cdf6e76a1e5a2836b2440c6 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Fri, 3 Feb 2023 15:55:46 +0100 Subject: [PATCH 15/50] cambio yaml --- .gitlab-ci.yml | 48 +++++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index feb4e24f..fe8fa15a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -29,8 +29,10 @@ variables: if (! [String]::IsNullOrWhiteSpace($hasSource)) { dotnet nuget remove source nuget.org } - dotnet nuget add source https://nexus.steamware.net/repository/nuget-proxy-v3/index.json -n nexus-proxy-v3 -u nugetUser -p viaDante16 --store-password-in-clear-text - echo "Has Source: $hasSource" + dotnet nuget add source https://nexus.steamware.net/repository/nuget-proxy-v3/index.json -n nexus-proxy-v3 -u nugetUser -p $NEXUS_PASSWD --store-password-in-clear-text + $hasSource = dotnet nuget list source + echo "Situazione sorgenti nuget:" + dotnet nuget list source # helper creazione hash files x IIS .hashBuild: &hashBuild @@ -184,7 +186,7 @@ LAND:IIS01:deploy: needs: ["LAND:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj PROG:IIS01:deploy: stage: deploy @@ -201,7 +203,7 @@ PROG:IIS01:deploy: needs: ["PROG:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj STAT:IIS01:deploy: stage: deploy @@ -218,7 +220,7 @@ STAT:IIS01:deploy: needs: ["STAT:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj MON:IIS01:deploy: stage: deploy @@ -235,7 +237,7 @@ MON:IIS01:deploy: needs: ["MON:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj SPEC:IIS01:deploy: stage: deploy @@ -252,7 +254,7 @@ SPEC:IIS01:deploy: needs: ["SPEC:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj INVE:IIS01:deploy: stage: deploy @@ -269,7 +271,7 @@ INVE:IIS01:deploy: needs: ["INVE:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj CONF:IIS01:deploy: stage: deploy @@ -286,7 +288,7 @@ CONF:IIS01:deploy: needs: ["CONF:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj LAND:IIS02:deploy: stage: deploy @@ -303,8 +305,8 @@ LAND:IIS02:deploy: needs: ["LAND:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj PROG:IIS02:deploy: stage: deploy @@ -321,8 +323,8 @@ PROG:IIS02:deploy: needs: ["PROG:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj STAT:IIS02:deploy: stage: deploy @@ -339,8 +341,8 @@ STAT:IIS02:deploy: needs: ["STAT:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj MON:IIS02:deploy: stage: deploy @@ -357,8 +359,8 @@ MON:IIS02:deploy: needs: ["MON:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj SPEC:IIS02:deploy: stage: deploy @@ -375,8 +377,8 @@ SPEC:IIS02:deploy: needs: ["SPEC:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj INVE:IIS02:deploy: stage: deploy @@ -393,8 +395,8 @@ INVE:IIS02:deploy: needs: ["INVE:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj CONF:IIS02:deploy: stage: deploy @@ -411,8 +413,8 @@ CONF:IIS02:deploy: needs: ["CONF:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=viadante16 -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj LAND:installer: stage: installer From f6b010d47b04cfbd77eb23fc38de01a9bd61abe2 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Fri, 3 Feb 2023 16:03:48 +0100 Subject: [PATCH 16/50] ancora update yaml x nuget... --- .gitlab-ci.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fe8fa15a..02c09ff3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -25,13 +25,12 @@ variables: if (! [String]::IsNullOrWhiteSpace($hasSource)) { dotnet nuget remove source 'Microsoft Visual Studio Offline Packages' } - $hasSource = dotnet nuget list source | Select-String -Pattern "nuget.org" - if (! [String]::IsNullOrWhiteSpace($hasSource)) { - dotnet nuget remove source nuget.org - } + echo "Situazione sorgenti post remove:" + dotnet nuget list source dotnet nuget add source https://nexus.steamware.net/repository/nuget-proxy-v3/index.json -n nexus-proxy-v3 -u nugetUser -p $NEXUS_PASSWD --store-password-in-clear-text + dotnet nuget add source https://nexus.steamware.net/repository/nuget-hosted/ -n nexus-proxy-v3 -u nugetUser -p $NEXUS_PASSWD --store-password-in-clear-text $hasSource = dotnet nuget list source - echo "Situazione sorgenti nuget:" + echo "Situazione sorgenti FINALE:" dotnet nuget list source # helper creazione hash files x IIS From 0f13904976b92d874478dbe150a9de57579275b5 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Fri, 3 Feb 2023 16:04:21 +0100 Subject: [PATCH 17/50] fix hosted name --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 02c09ff3..d3c8eb32 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -28,7 +28,7 @@ variables: echo "Situazione sorgenti post remove:" dotnet nuget list source dotnet nuget add source https://nexus.steamware.net/repository/nuget-proxy-v3/index.json -n nexus-proxy-v3 -u nugetUser -p $NEXUS_PASSWD --store-password-in-clear-text - dotnet nuget add source https://nexus.steamware.net/repository/nuget-hosted/ -n nexus-proxy-v3 -u nugetUser -p $NEXUS_PASSWD --store-password-in-clear-text + dotnet nuget add source https://nexus.steamware.net/repository/nuget-hosted/ -n nexus-hosted -u nugetUser -p $NEXUS_PASSWD --store-password-in-clear-text $hasSource = dotnet nuget list source echo "Situazione sorgenti FINALE:" dotnet nuget list source From 33d6b52767c0a09354078109fe2c2ac01019e3b2 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Fri, 3 Feb 2023 16:04:45 +0100 Subject: [PATCH 18/50] fix pre-remove --- .gitlab-ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d3c8eb32..4b6c630e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -21,6 +21,10 @@ variables: if (! [String]::IsNullOrWhiteSpace($hasSource)) { dotnet nuget remove source nexus-proxy-v3 } + $hasSource = dotnet nuget list source | Select-String -Pattern "nexus-hosted" + if (! [String]::IsNullOrWhiteSpace($hasSource)) { + dotnet nuget remove source nexus-hosted + } $hasSource = dotnet nuget list source | Select-String -Pattern "Microsoft Visual Studio Offline Packages" if (! [String]::IsNullOrWhiteSpace($hasSource)) { dotnet nuget remove source 'Microsoft Visual Studio Offline Packages' From c2f5559a5461372c9cb315811209299963e3ed77 Mon Sep 17 00:00:00 2001 From: "zaccaria.majid" Date: Fri, 3 Feb 2023 16:56:40 +0100 Subject: [PATCH 19/50] ancora refresh --- MP.INVE/MP.INVE.csproj | 6 +++--- MP.INVE/Resources/ChangeLog.html | 2 +- MP.INVE/Resources/VersNum.txt | 2 +- MP.INVE/Resources/manifest.xml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/MP.INVE/MP.INVE.csproj b/MP.INVE/MP.INVE.csproj index 804961ba..04e8ed68 100644 --- a/MP.INVE/MP.INVE.csproj +++ b/MP.INVE/MP.INVE.csproj @@ -5,7 +5,7 @@ enable enable MP.INVE - 6.16.2302.312 + 6.16.2302.316 @@ -17,9 +17,9 @@ - + - + diff --git a/MP.INVE/Resources/ChangeLog.html b/MP.INVE/Resources/ChangeLog.html index 61133f72..d72b423b 100644 --- a/MP.INVE/Resources/ChangeLog.html +++ b/MP.INVE/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo MAPOINVE -

                Versione: 6.16.2302.312

                +

                Versione: 6.16.2302.316


                Note di rilascio:
                • diff --git a/MP.INVE/Resources/VersNum.txt b/MP.INVE/Resources/VersNum.txt index c23401eb..f4429b18 100644 --- a/MP.INVE/Resources/VersNum.txt +++ b/MP.INVE/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2302.312 +6.16.2302.316 diff --git a/MP.INVE/Resources/manifest.xml b/MP.INVE/Resources/manifest.xml index 93f5270b..3f8ef48b 100644 --- a/MP.INVE/Resources/manifest.xml +++ b/MP.INVE/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2302.312 + 6.16.2302.316 https://nexus.steamware.net/repository/SWS/MP-INVE/stable/LAST/MP.INVE.zip https://nexus.steamware.net/repository/SWS/MP-INVE/stable/LAST/ChangeLog.html false From 54c76c5805311ebaedcf6b7691b81b8d4239b620 Mon Sep 17 00:00:00 2001 From: "zaccaria.majid" Date: Fri, 3 Feb 2023 17:33:16 +0100 Subject: [PATCH 20/50] trigger build --- .gitlab-ci.yml | 2 +- MP.Stats/MP.Stats.csproj | 6 +++--- MP.Stats/Resources/ChangeLog.html | 2 +- MP.Stats/Resources/VersNum.txt | 2 +- MP.Stats/Resources/manifest.xml | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4b6c630e..ab1573d9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -8,7 +8,7 @@ variables: .nuget-fix: &nuget-fix - | echo "esecuzione Nuget FIX steps" - dotnet nuget list source + dotnet nuget list source $hasSource = dotnet nuget list source | Select-String -Pattern "Steamware Nexus Proxy" if (! [String]::IsNullOrWhiteSpace($hasSource)) { dotnet nuget remove source "`"Steamware Nexus Proxy`"" diff --git a/MP.Stats/MP.Stats.csproj b/MP.Stats/MP.Stats.csproj index 787421fe..cd1ea486 100644 --- a/MP.Stats/MP.Stats.csproj +++ b/MP.Stats/MP.Stats.csproj @@ -4,8 +4,8 @@ net6.0 MP.Stats 826e877c-ba70-4253-84cb-d0b1cafd4440 - 6.16.2301.0515 - 6.16.2302.0312 + 6.16.2302.0317 + 6.16.2302.0317 @@ -186,7 +186,7 @@ - + diff --git a/MP.Stats/Resources/ChangeLog.html b/MP.Stats/Resources/ChangeLog.html index c2796670..33047e79 100644 --- a/MP.Stats/Resources/ChangeLog.html +++ b/MP.Stats/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo statistiche MAPO -

                  Versione: 6.16.2302.0312

                  +

                  Versione: 6.16.2302.0317


                  Note di rilascio:
                    diff --git a/MP.Stats/Resources/VersNum.txt b/MP.Stats/Resources/VersNum.txt index 7f8e6acc..b1be46c4 100644 --- a/MP.Stats/Resources/VersNum.txt +++ b/MP.Stats/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2302.0312 +6.16.2302.0317 diff --git a/MP.Stats/Resources/manifest.xml b/MP.Stats/Resources/manifest.xml index c154b2a2..f0068808 100644 --- a/MP.Stats/Resources/manifest.xml +++ b/MP.Stats/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2302.0312 + 6.16.2302.0317 https://nexus.steamware.net/repository/SWS/MP-STATS/stable/LAST/MP.Stats.zip https://nexus.steamware.net/repository/SWS/MP-STATS/stable/LAST/ChangeLog.html false From 586340a0f77a2779bcaf6bca838ae7c0abbc71b1 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Tue, 7 Feb 2023 17:17:34 +0100 Subject: [PATCH 21/50] Aggiunta preliminare fodler conf ricette --- MP.SPEC/Recipe/Fimat/Recipe.json | 60 ++++++++++++++++++++++ MP.SPEC/Recipe/Fimat/RecipeCalcFields.json | 11 ++++ MP.SPEC/Recipe/Fimat/RecipeEditFields.json | 60 ++++++++++++++++++++++ 3 files changed, 131 insertions(+) create mode 100644 MP.SPEC/Recipe/Fimat/Recipe.json create mode 100644 MP.SPEC/Recipe/Fimat/RecipeCalcFields.json create mode 100644 MP.SPEC/Recipe/Fimat/RecipeEditFields.json diff --git a/MP.SPEC/Recipe/Fimat/Recipe.json b/MP.SPEC/Recipe/Fimat/Recipe.json new file mode 100644 index 00000000..5e5c1292 --- /dev/null +++ b/MP.SPEC/Recipe/Fimat/Recipe.json @@ -0,0 +1,60 @@ +{ + "A_Recipe": { + "DesRecipe": { + "DesData": { + "Prio": "N", + "DrumType": "1", + "CustDrumCode": "123456789012", + "OrderCode": "ORDERCODE", + "Customer": "CUSTOMER", + "Design": "DESIGN", + "Screen": "SCREEN", + "Variant": "VARIANT", + "RecName": "RECNAME", + "Article": "ARTICLE", + "LotID": "LOTID", + "Info1": "INFO1", + "ViscoName": "", + "Taglio-N": "1", + "Taglio-D": "4", + "Sequence": "1", + "SequenceTot": "8", + "Series": "2", + "ViscoValue": "0", + "UM": "1", + "DosType": "P", + "ServiceType": "N", + "RecipeType": "C", + "Note1": "NOTE1", + "Note2": "NOTE2", + "Quantity-kg": "10.00" + } + }, + "ColRecipe": [ + { + "ColData": { + "CompNumber": "1", + "ColourCode": "C001", + "Description": "COLOR1", + "TypComp": "C", + "PartsWeight": "1.00", + "PartsPerc": "0.10", + "Weight-gr": "30.00", + "Weight-gr-prev": "0.00" + } + }, + { + "ColData": { + "CompNumber": "2", + "ColourCode": "THICK1", + "Description": "Thickner 1", + "TypComp": "A", + "PartsWeight": "997.00", + "PartsPerc": "99.70", + "Weight-gr": "9970.00", + "Weight-gr-prev": "0.00" + } + } + ] + } +} \ No newline at end of file diff --git a/MP.SPEC/Recipe/Fimat/RecipeCalcFields.json b/MP.SPEC/Recipe/Fimat/RecipeCalcFields.json new file mode 100644 index 00000000..d1ad3d32 --- /dev/null +++ b/MP.SPEC/Recipe/Fimat/RecipeCalcFields.json @@ -0,0 +1,11 @@ +{ + "A_Recipe": { + "DesRecipe": { + "DesData": { + "Article": "ARTICLE", + "LotID": "LOTID", + "Info1": "INFO1" + } + } + } +} \ No newline at end of file diff --git a/MP.SPEC/Recipe/Fimat/RecipeEditFields.json b/MP.SPEC/Recipe/Fimat/RecipeEditFields.json new file mode 100644 index 00000000..5e5c1292 --- /dev/null +++ b/MP.SPEC/Recipe/Fimat/RecipeEditFields.json @@ -0,0 +1,60 @@ +{ + "A_Recipe": { + "DesRecipe": { + "DesData": { + "Prio": "N", + "DrumType": "1", + "CustDrumCode": "123456789012", + "OrderCode": "ORDERCODE", + "Customer": "CUSTOMER", + "Design": "DESIGN", + "Screen": "SCREEN", + "Variant": "VARIANT", + "RecName": "RECNAME", + "Article": "ARTICLE", + "LotID": "LOTID", + "Info1": "INFO1", + "ViscoName": "", + "Taglio-N": "1", + "Taglio-D": "4", + "Sequence": "1", + "SequenceTot": "8", + "Series": "2", + "ViscoValue": "0", + "UM": "1", + "DosType": "P", + "ServiceType": "N", + "RecipeType": "C", + "Note1": "NOTE1", + "Note2": "NOTE2", + "Quantity-kg": "10.00" + } + }, + "ColRecipe": [ + { + "ColData": { + "CompNumber": "1", + "ColourCode": "C001", + "Description": "COLOR1", + "TypComp": "C", + "PartsWeight": "1.00", + "PartsPerc": "0.10", + "Weight-gr": "30.00", + "Weight-gr-prev": "0.00" + } + }, + { + "ColData": { + "CompNumber": "2", + "ColourCode": "THICK1", + "Description": "Thickner 1", + "TypComp": "A", + "PartsWeight": "997.00", + "PartsPerc": "99.70", + "Weight-gr": "9970.00", + "Weight-gr-prev": "0.00" + } + } + ] + } +} \ No newline at end of file From 68c7004828ea44139b3310fa5376b65e3546ca31 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Tue, 7 Feb 2023 17:17:43 +0100 Subject: [PATCH 22/50] Update modello dati x gestione conf ricette --- MP.Data/Controllers/MpSpecController.cs | 49 ++++++++++++++----------- MP.Data/DatabaseModels/Macchine.cs | 2 + 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/MP.Data/Controllers/MpSpecController.cs b/MP.Data/Controllers/MpSpecController.cs index 3f8b3c6d..aef9d456 100644 --- a/MP.Data/Controllers/MpSpecController.cs +++ b/MP.Data/Controllers/MpSpecController.cs @@ -699,31 +699,38 @@ namespace MP.Data.Controllers public List MacchineGetFilt(string codGruppo) { List dbResult = new List(); - using (var dbCtx = new MoonProContext(_configuration)) + try { - if (codGruppo == "*") + using (var dbCtx = new MoonProContext(_configuration)) { - dbResult = dbCtx - .DbSetMacchine - .AsNoTracking() - .OrderBy(x => x.IdxMacchina) - .ToList(); - } - else - { - dbResult = dbCtx - .DbSetGrp2Macc - .Where(g => g.CodGruppo == codGruppo) - .Join(dbCtx.DbSetMacchine, - g => g.IdxMacchina, - m => m.IdxMacchina, - (g, m) => m - ) - .AsNoTracking() - .OrderBy(x => x.IdxMacchina) - .ToList(); + if (codGruppo == "*") + { + dbResult = dbCtx + .DbSetMacchine + .AsNoTracking() + .OrderBy(x => x.IdxMacchina) + .ToList(); + } + else + { + dbResult = dbCtx + .DbSetGrp2Macc + .Where(g => g.CodGruppo == codGruppo) + .Join(dbCtx.DbSetMacchine, + g => g.IdxMacchina, + m => m.IdxMacchina, + (g, m) => m + ) + .AsNoTracking() + .OrderBy(x => x.IdxMacchina) + .ToList(); + } } } + catch(Exception exc) + { + Log.Error($"Eccezione in MacchineGetFilt{Environment.NewLine}{exc}"); + } return dbResult; } diff --git a/MP.Data/DatabaseModels/Macchine.cs b/MP.Data/DatabaseModels/Macchine.cs index a2bbcc56..858e9709 100644 --- a/MP.Data/DatabaseModels/Macchine.cs +++ b/MP.Data/DatabaseModels/Macchine.cs @@ -20,6 +20,8 @@ namespace MP.Data.DatabaseModels public string CodMacchina { get; set; } = ""; public string Nome { get; set; } = ""; public string Descrizione { get; set; } = ""; + public string RecipePath { get; set; } = ""; + //public string Note { get; set; } = ""; //public string url { get; set; } = ""; //public string locazione { get; set; } = ""; From f099a8d48e54e473fef41d338c0f162c3c332c55 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Tue, 7 Feb 2023 17:17:53 +0100 Subject: [PATCH 23/50] Inizio modifiche PODL x gestione ricette --- MP.SPEC/Components/CmpFooter.razor.cs | 9 +- MP.SPEC/Components/ListPODL.razor | 118 +++++++++++++++----------- MP.SPEC/Components/ListPODL.razor.cs | 92 +++++++++++++------- MP.SPEC/Data/MpDataService.cs | 36 ++++++++ MP.SPEC/MP.SPEC.csproj | 5 +- MP.SPEC/Pages/PODL.razor | 18 ---- MP.SPEC/Pages/PODL.razor.cs | 1 + MP.SPEC/Resources/ChangeLog.html | 2 +- MP.SPEC/Resources/VersNum.txt | 2 +- MP.SPEC/Resources/manifest.xml | 2 +- 10 files changed, 183 insertions(+), 102 deletions(-) diff --git a/MP.SPEC/Components/CmpFooter.razor.cs b/MP.SPEC/Components/CmpFooter.razor.cs index 45a9cccf..1bfe95fb 100644 --- a/MP.SPEC/Components/CmpFooter.razor.cs +++ b/MP.SPEC/Components/CmpFooter.razor.cs @@ -8,9 +8,12 @@ namespace MP.SPEC.Components public void Dispose() { - aTimer.Elapsed -= ElapsedTimer; - aTimer.Stop(); - aTimer.Dispose(); + if (aTimer != null) + { + aTimer.Elapsed -= ElapsedTimer; + aTimer.Stop(); + aTimer.Dispose(); + } } public void ElapsedTimer(object? source, System.Timers.ElapsedEventArgs e) diff --git a/MP.SPEC/Components/ListPODL.razor b/MP.SPEC/Components/ListPODL.razor index 5500e381..b790af50 100644 --- a/MP.SPEC/Components/ListPODL.razor +++ b/MP.SPEC/Components/ListPODL.razor @@ -12,7 +12,7 @@ else if (totalCount == 0) else {
                    -
                    +
                    @@ -25,11 +25,13 @@ else - - - @**@ - - + @if (!showRecipe) + { + + + + + } @@ -37,27 +39,39 @@ else { - - - @**@ - - + @if (!showRecipe) + { + + + + + } }
                    Cod Articolo Fase Macchina Info ciclo Note Att Macchina Info ciclo Att
                    - - @if (record.IdxOdl == 0) + @if (!showRecipe) { - @if (canStartOdl(record.IdxMacchina)) + + @if (record.IdxOdl == 0) { - + @if (canStartOdl(record.IdxMacchina)) + { + + } + else + { + + } + @if (canStartOdl(record.IdxMacchina)) + { + + } + else + { + + } } - else + } + @if (MachineWithRecipe) + { + @if (machineHasRecipe(record.IdxMacchina).Result) { - - } - @if (canStartOdl(record.IdxMacchina)) - { - - } - else - { - } } @@ -100,36 +114,44 @@ else } - @record.IdxMacchina -
                    @record.Nome
                    -
                    -
                    N° pezzi: @record.NumPezzi
                    -
                    T. Ciclo: @record.Tcassegnato.ToString("N3")
                    -
                    @record.Note - @if (@record.Attivabile) - { - - } - else - { - - } - - @if (POdlDelEnabled(record.IdxOdl)) - { - - } - + @record.IdxMacchina +
                    @record.Nome
                    +
                    +
                    N° pezzi: @record.NumPezzi
                    +
                    T. Ciclo: @record.Tcassegnato.ToString("N3")
                    +
                    + @if (@record.Attivabile) + { + + } + else + { + + } + + @if (POdlDelEnabled(record.IdxOdl)) + { + + } +
                    + @if (showRecipe) + { +
                    + dettaglio ricetta +
                    + }
                    } diff --git a/MP.SPEC/Components/ListPODL.razor.cs b/MP.SPEC/Components/ListPODL.razor.cs index f481fb79..1bb09f32 100644 --- a/MP.SPEC/Components/ListPODL.razor.cs +++ b/MP.SPEC/Components/ListPODL.razor.cs @@ -59,6 +59,12 @@ namespace MP.SPEC.Components #region Protected Properties + protected string header + { + get => actFilter.Header; + set => actFilter.Header = value; + } + [Inject] protected IJSRuntime JSRuntime { get; set; } = null!; @@ -104,8 +110,9 @@ namespace MP.SPEC.Components protected override async Task OnInitializedAsync() { - //await FilterChanged.InvokeAsync(actFilter); ListStati = await MDService.AnagStatiComm(); + var strMachRecipe = await MDService.tryGetConfig("MachineWithRecipe"); + bool.TryParse(strMachRecipe, out MachineWithRecipe); } protected override async Task OnParametersSetAsync() @@ -136,6 +143,7 @@ namespace MP.SPEC.Components protected async Task resetSel() { currRecord = null; + showRecipe = false; await RecordSel.InvokeAsync(null); } @@ -196,6 +204,12 @@ namespace MP.SPEC.Components } } + protected void doShowRecipe(PODLExpModel selRec) + { + showRecipe = true; + currRecord = selRec; + } + protected async Task UpdateData() { currRecord = null; @@ -207,10 +221,15 @@ namespace MP.SPEC.Components #region Private Fields private static Logger Log = LogManager.GetCurrentClassLogger(); + private PODLExpModel? currRecord = null; + private List? ListRecords; + private List? ListStati; + private bool MachineWithRecipe = false; + /// /// scadenza validità lista ODL correnti /// @@ -223,35 +242,12 @@ namespace MP.SPEC.Components private List? SearchRecords; + private bool showRecipe = false; + #endregion Private Fields #region Private Properties - - private DateTime selDtStart - { - get => actFilter.DtStart; - set - { - if (!actFilter.DtStart.Equals(value)) - { - actFilter.DtStart = value; - currPage = 1; - } - } - } - private DateTime selDtEnd - { - get => actFilter.DtEnd; - set - { - if (!actFilter.DtEnd.Equals(value)) - { - actFilter.DtEnd = value; - currPage = 1; - } - } - } private int _totalCount { get; set; } = 0; private int currPage @@ -267,6 +263,7 @@ namespace MP.SPEC.Components } private bool isLoading { get; set; } = false; + private SelectXdlParams lastFilter { get; set; } = new SelectXdlParams() { CurrPage = -1 }; private string macchina @@ -275,6 +272,11 @@ namespace MP.SPEC.Components set => actFilter.IdxMacchina = value; } + private string mainCss + { + get => showRecipe ? "col-8" : "col-12"; + } + private int numRecord { get => actFilter.NumRec; @@ -292,6 +294,32 @@ namespace MP.SPEC.Components get => string.IsNullOrEmpty(actFilter.SearchVal) ? "*" : actFilter.SearchVal; } + private DateTime selDtEnd + { + get => actFilter.DtEnd; + set + { + if (!actFilter.DtEnd.Equals(value)) + { + actFilter.DtEnd = value; + currPage = 1; + } + } + } + + private DateTime selDtStart + { + get => actFilter.DtStart; + set + { + if (!actFilter.DtStart.Equals(value)) + { + actFilter.DtStart = value; + currPage = 1; + } + } + } + private string StatoSel { get => actFilter.CodFase; @@ -385,10 +413,16 @@ namespace MP.SPEC.Components answ = !odlCurrList.Contains(idxMacchina); return answ; } - protected string header + + /// + /// Verifica se la macchina abbia associata una ricetta (template) + /// + /// + /// + private async Task machineHasRecipe(string idxMacchina) { - get => actFilter.Header; - set => actFilter.Header = value; + string recipePath = await MDService.MacchineRecipe(idxMacchina); + return !string.IsNullOrEmpty(recipePath); } /// diff --git a/MP.SPEC/Data/MpDataService.cs b/MP.SPEC/Data/MpDataService.cs index d8925e97..c583d9c8 100644 --- a/MP.SPEC/Data/MpDataService.cs +++ b/MP.SPEC/Data/MpDataService.cs @@ -886,6 +886,41 @@ namespace MP.SPEC.Data return result; } + /// + /// Verifica se la macchina abbia un codice ricetta associato + /// + /// + /// + public async Task MacchineRecipe(string idxMacchina) + { + string? result = ""; + Stopwatch stopWatch = new Stopwatch(); + stopWatch.Start(); + string readType = "DB"; + string currKey = $"{redisMacRecipe}:{idxMacchina}"; + // cerco in redis dato valore sel macchina... + RedisValue rawData = redisDb.StringGet(currKey); + if (rawData.HasValue) + { + result = JsonConvert.DeserializeObject($"{rawData}"); + readType = "REDIS"; + } + else + { + //recupero elenco macchine... + var machineList = await MacchineGetFilt("*"); + var currMach = machineList.Where(x => x.IdxMacchina == idxMacchina).FirstOrDefault(); + result = currMach != null ? currMach.RecipePath : null; + // serializzo e salvo... + rawData = JsonConvert.SerializeObject(result); + redisDb.StringSet(currKey, rawData, getRandTOut(redisLongTimeCache)); + } + stopWatch.Stop(); + TimeSpan ts = stopWatch.Elapsed; + Log.Debug($"MacchineRecipe | Read from {readType}: {ts.TotalMilliseconds}ms"); + return result ?? ""; + } + /// /// Elenco id Macchine che abbiano dati FLuxLog, nel periodo indicato /// @@ -1436,6 +1471,7 @@ namespace MP.SPEC.Data private const string redisMacByFlux = redisBaseAddrSpec + "Cache:MacByFlux"; private const string redisMacList = redisBaseAddrSpec + "Cache:MacList"; + private const string redisMacRecipe = redisBaseAddrSpec + "Cache:Recipe"; private const string redisOdlByBatch = redisXdlData + "OdlByBatch"; private const string redisOdlCurrByMac = redisXdlData + "OdlByMac"; diff --git a/MP.SPEC/MP.SPEC.csproj b/MP.SPEC/MP.SPEC.csproj index f6142ab5..b174410e 100644 --- a/MP.SPEC/MP.SPEC.csproj +++ b/MP.SPEC/MP.SPEC.csproj @@ -5,7 +5,7 @@ enable enable MP.SPEC - 6.16.2302.315 + 6.16.2302.717 @@ -39,6 +39,9 @@ + + PreserveNewest + Always diff --git a/MP.SPEC/Pages/PODL.razor b/MP.SPEC/Pages/PODL.razor index 1c4eb2c1..ff9d7e44 100644 --- a/MP.SPEC/Pages/PODL.razor +++ b/MP.SPEC/Pages/PODL.razor @@ -80,17 +80,9 @@ { foreach (var item in ListArticoli) { - @* @if (item.CodArticolo == currRecordControlli.CodArticolo) - { - - else - { - } - }*@ } } - }
                    @@ -135,7 +127,6 @@ @if (currGruppoSel != null) { - @* *@ } @@ -153,15 +144,6 @@ { @if (!item.Descrizione.Contains("NEW Descrizione")) { - - @*if (item.IdxMacchina == currRecordControlli.IdxMacchina) - { - - } - else - { - } - *@ } } diff --git a/MP.SPEC/Pages/PODL.razor.cs b/MP.SPEC/Pages/PODL.razor.cs index cf8fe54f..8fd268a4 100644 --- a/MP.SPEC/Pages/PODL.razor.cs +++ b/MP.SPEC/Pages/PODL.razor.cs @@ -404,6 +404,7 @@ namespace MP.SPEC.Pages #region Private Methods + /// /// Chiama metodo x chiedere sync DB /// diff --git a/MP.SPEC/Resources/ChangeLog.html b/MP.SPEC/Resources/ChangeLog.html index d5e65297..bb9f2529 100644 --- a/MP.SPEC/Resources/ChangeLog.html +++ b/MP.SPEC/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo MAPOSPEC -

                    Versione: 6.16.2302.315

                    +

                    Versione: 6.16.2302.717


                    Note di rilascio:
                    • diff --git a/MP.SPEC/Resources/VersNum.txt b/MP.SPEC/Resources/VersNum.txt index 0e6993b1..47dea22b 100644 --- a/MP.SPEC/Resources/VersNum.txt +++ b/MP.SPEC/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2302.315 +6.16.2302.717 diff --git a/MP.SPEC/Resources/manifest.xml b/MP.SPEC/Resources/manifest.xml index 2276dbd6..ee6a7450 100644 --- a/MP.SPEC/Resources/manifest.xml +++ b/MP.SPEC/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2302.315 + 6.16.2302.717 https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/MP.SPEC.zip https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/ChangeLog.html false From 1a00cfe70af554bbefde54bc7839287c3d54cdda Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Tue, 7 Feb 2023 20:51:20 +0100 Subject: [PATCH 24/50] Inizio configuraizone modelli ricetta --- MP.Data/Conf/RecipeBlockConfig.cs | 43 +++++++++++++++++++++++++++++++ MP.Data/Conf/RecipeConfig.cs | 22 ++++++++++++++++ MP.Data/MP.Data.csproj | 1 + MP.Data/MgModels/RecipeModel.cs | 24 +++++++++++++++++ 4 files changed, 90 insertions(+) create mode 100644 MP.Data/Conf/RecipeBlockConfig.cs create mode 100644 MP.Data/Conf/RecipeConfig.cs create mode 100644 MP.Data/MgModels/RecipeModel.cs diff --git a/MP.Data/Conf/RecipeBlockConfig.cs b/MP.Data/Conf/RecipeBlockConfig.cs new file mode 100644 index 00000000..f95a879b --- /dev/null +++ b/MP.Data/Conf/RecipeBlockConfig.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MP.Data.Conf +{ + /// + /// Configurazione blocco ricetta (Header / Rows) + /// + public class RecipeBlockConfig + { + /// + /// Dizionario delle chiavi prefissate + /// + public Dictionary FixedKeys { get; set; } = new Dictionary(); + /// + /// Dizionario delle chiavi Calcolate + /// + public Dictionary CalcKeys { get; set; } = new Dictionary(); + /// + /// Dizionario delle chiavi Editabili + /// + public Dictionary EditKeys { get; set; } = new Dictionary(); + + /// + /// Dizionario degli enum permessi + /// + public Dictionary> EnumVal { get; set; } = new Dictionary>(); + /// + /// Dizionario degli enum permessi + /// + public Dictionary CalcVal { get; set; } = new Dictionary(); + + public class CalcDetail + { + public string Description { get; set; } = null!; + public string Type { get; set; } = null!; + public string Format { get; set; } = null!; + } + } +} diff --git a/MP.Data/Conf/RecipeConfig.cs b/MP.Data/Conf/RecipeConfig.cs new file mode 100644 index 00000000..0e19ea21 --- /dev/null +++ b/MP.Data/Conf/RecipeConfig.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MP.Data.Conf +{ + public class RecipeConfig + { + public string TemplateFile { get; set; } = ""; + /// + /// Configurazione ricetta x header + /// + public RecipeBlockConfig HeadConf { get; set; } = new RecipeBlockConfig(); + /// + /// Configurazione ricetta x rows + /// + public RecipeBlockConfig RowsConf { get; set; } = new RecipeBlockConfig(); + + } +} diff --git a/MP.Data/MP.Data.csproj b/MP.Data/MP.Data.csproj index 586f068a..806b55f7 100644 --- a/MP.Data/MP.Data.csproj +++ b/MP.Data/MP.Data.csproj @@ -25,6 +25,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + \ No newline at end of file diff --git a/MP.Data/MgModels/RecipeModel.cs b/MP.Data/MgModels/RecipeModel.cs new file mode 100644 index 00000000..63f53ab1 --- /dev/null +++ b/MP.Data/MgModels/RecipeModel.cs @@ -0,0 +1,24 @@ +using MongoDB.Bson.Serialization.Attributes; +using MongoDB.Bson; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MP.Data.MgModels +{ + public class RecipeModel + { + [BsonId] + [BsonRepresentation(BsonType.ObjectId)] + public string? Id { get; set; } + + public int IdxPODL { get; set; } = 0; + public int IdxODL { get; set; } = 0; + public string TemplatePath { get; set; } = null!; + + public string RawRecipe { get; set; } = null!; + + } +} From 40c8bb1a227e606874769f2ad685078b45abdf55 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Tue, 7 Feb 2023 20:51:30 +0100 Subject: [PATCH 25/50] Aggiunta file conf preliminari x FIMAT --- MP.SPEC/Components/ListPODL.razor | 4 +- MP.SPEC/Components/RecipeMan.razor | 2 + MP.SPEC/Components/RecipeMan.razor.cs | 29 +++++++ MP.SPEC/MP.SPEC.csproj | 10 ++- MP.SPEC/Recipe/Fimat/RecipeCalcFields.json | 11 --- MP.SPEC/Recipe/Fimat/RecipeConf.json | 5 ++ MP.SPEC/Recipe/Fimat/RecipeEditFields.json | 60 -------------- MP.SPEC/Recipe/Fimat/TemplateHead.json | 83 +++++++++++++++++++ MP.SPEC/Recipe/Fimat/TemplateOutput.tpl | 11 +++ MP.SPEC/Recipe/Fimat/TemplateRows.json | 16 ++++ .../Fimat/{Recipe.json => _RefRecipe.json} | 0 11 files changed, 157 insertions(+), 74 deletions(-) create mode 100644 MP.SPEC/Components/RecipeMan.razor create mode 100644 MP.SPEC/Components/RecipeMan.razor.cs delete mode 100644 MP.SPEC/Recipe/Fimat/RecipeCalcFields.json create mode 100644 MP.SPEC/Recipe/Fimat/RecipeConf.json delete mode 100644 MP.SPEC/Recipe/Fimat/RecipeEditFields.json create mode 100644 MP.SPEC/Recipe/Fimat/TemplateHead.json create mode 100644 MP.SPEC/Recipe/Fimat/TemplateOutput.tpl create mode 100644 MP.SPEC/Recipe/Fimat/TemplateRows.json rename MP.SPEC/Recipe/Fimat/{Recipe.json => _RefRecipe.json} (100%) diff --git a/MP.SPEC/Components/ListPODL.razor b/MP.SPEC/Components/ListPODL.razor index b790af50..eaf09467 100644 --- a/MP.SPEC/Components/ListPODL.razor +++ b/MP.SPEC/Components/ListPODL.razor @@ -146,10 +146,10 @@ else - @if (showRecipe) + @if (showRecipe && currRecord != null) {
                      - dettaglio ricetta +
                      } diff --git a/MP.SPEC/Components/RecipeMan.razor b/MP.SPEC/Components/RecipeMan.razor new file mode 100644 index 00000000..53c84bc8 --- /dev/null +++ b/MP.SPEC/Components/RecipeMan.razor @@ -0,0 +1,2 @@ +

                      RecipeMan

                      + diff --git a/MP.SPEC/Components/RecipeMan.razor.cs b/MP.SPEC/Components/RecipeMan.razor.cs new file mode 100644 index 00000000..a16156d4 --- /dev/null +++ b/MP.SPEC/Components/RecipeMan.razor.cs @@ -0,0 +1,29 @@ +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 MP.SPEC; +using MP.SPEC.Shared; +using MP.SPEC.Components; +using EgwCoreLib.Razor; + +namespace MP.SPEC.Components +{ + public partial class RecipeMan + { + + [Parameter] + public int IdxOdl { get; set; } = 0; + + + } +} \ No newline at end of file diff --git a/MP.SPEC/MP.SPEC.csproj b/MP.SPEC/MP.SPEC.csproj index b174410e..ddbbd88b 100644 --- a/MP.SPEC/MP.SPEC.csproj +++ b/MP.SPEC/MP.SPEC.csproj @@ -12,6 +12,14 @@ + + + + + + + + @@ -39,7 +47,7 @@ - + PreserveNewest diff --git a/MP.SPEC/Recipe/Fimat/RecipeCalcFields.json b/MP.SPEC/Recipe/Fimat/RecipeCalcFields.json deleted file mode 100644 index d1ad3d32..00000000 --- a/MP.SPEC/Recipe/Fimat/RecipeCalcFields.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "A_Recipe": { - "DesRecipe": { - "DesData": { - "Article": "ARTICLE", - "LotID": "LOTID", - "Info1": "INFO1" - } - } - } -} \ No newline at end of file diff --git a/MP.SPEC/Recipe/Fimat/RecipeConf.json b/MP.SPEC/Recipe/Fimat/RecipeConf.json new file mode 100644 index 00000000..dea24c34 --- /dev/null +++ b/MP.SPEC/Recipe/Fimat/RecipeConf.json @@ -0,0 +1,5 @@ +{ + "TemplateFile": "TemplateOutput.tpl", + "HeadConf": "TemplateHead.json", + "RowsConf": "TemplateRows.json" +} \ No newline at end of file diff --git a/MP.SPEC/Recipe/Fimat/RecipeEditFields.json b/MP.SPEC/Recipe/Fimat/RecipeEditFields.json deleted file mode 100644 index 5e5c1292..00000000 --- a/MP.SPEC/Recipe/Fimat/RecipeEditFields.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "A_Recipe": { - "DesRecipe": { - "DesData": { - "Prio": "N", - "DrumType": "1", - "CustDrumCode": "123456789012", - "OrderCode": "ORDERCODE", - "Customer": "CUSTOMER", - "Design": "DESIGN", - "Screen": "SCREEN", - "Variant": "VARIANT", - "RecName": "RECNAME", - "Article": "ARTICLE", - "LotID": "LOTID", - "Info1": "INFO1", - "ViscoName": "", - "Taglio-N": "1", - "Taglio-D": "4", - "Sequence": "1", - "SequenceTot": "8", - "Series": "2", - "ViscoValue": "0", - "UM": "1", - "DosType": "P", - "ServiceType": "N", - "RecipeType": "C", - "Note1": "NOTE1", - "Note2": "NOTE2", - "Quantity-kg": "10.00" - } - }, - "ColRecipe": [ - { - "ColData": { - "CompNumber": "1", - "ColourCode": "C001", - "Description": "COLOR1", - "TypComp": "C", - "PartsWeight": "1.00", - "PartsPerc": "0.10", - "Weight-gr": "30.00", - "Weight-gr-prev": "0.00" - } - }, - { - "ColData": { - "CompNumber": "2", - "ColourCode": "THICK1", - "Description": "Thickner 1", - "TypComp": "A", - "PartsWeight": "997.00", - "PartsPerc": "99.70", - "Weight-gr": "9970.00", - "Weight-gr-prev": "0.00" - } - } - ] - } -} \ No newline at end of file diff --git a/MP.SPEC/Recipe/Fimat/TemplateHead.json b/MP.SPEC/Recipe/Fimat/TemplateHead.json new file mode 100644 index 00000000..c978f942 --- /dev/null +++ b/MP.SPEC/Recipe/Fimat/TemplateHead.json @@ -0,0 +1,83 @@ +{ + "FixedKeys": { + "CustDrumCode": "", + "Taglio-N": "1", + "Taglio-D": "4", + "ServiceType": "N", + "RecipeType": "C", + "ViscoName": "", + "ViscoValue": "0" + }, + "CalcKeys": { + "LotID": "PODL01", + "OrderCode": "PODL02", + "Article": "Art2PODL01", + "Info1": "Art2PODL02" + }, + "EditKeys": { + "Prio": "Enum:Priority", + "DrumType": "Enum:DrumType", + "Customer": "Tenditalia", + "Design": "DESIGN", + "Screen": "SCREEN", + "Variant": "VARIANT", + "RecName": "CODE000", + "Series": "Enum:Series", + "UM": "Enum:UM", + "DosType": "Enum:DosType", + "Note1": "", + "Note2": "", + "Sequence": "1", + "SequenceTot": "8", + "Quantity-kg": "1.00" + }, + "EnumVal": { + "Priority": { + "N": "Normal", + "H": "Hight" + }, + "DrumType": { + "1": "Small", + "2": "Medium", + "3": "Big" + }, + "Series": { + "1": "Series 1", + "2": "Series 2" + }, + "UM": { + "0": "Percentage", + "1": "g/kg", + "2": "parts for colour and g/kg for thickener", + "3": "gr and parts for thickener", + "4": "g/kg for colour and parts for thickener", + "5": "parts for colour and parts for thickener" + }, + "DosType": { + "P": "Production", + "S": "Sampling" + } + }, + "CalcVal": { + "PODL01": { + "Description": "Idx PODL", + "Type": "int", + "Format": "{0}" + }, + "PODL02": { + "Description": "Codice PODL", + "Type": "string", + "Format": "PODL{0:00000000}" + }, + "Art2PODL01": { + "Description": "Codice Articolo dato PODL", + "Type": "string", + "Format": "" + }, + "Art2PODL02": { + "Description": "Descrizione Articolo dato PODL", + "Type": "string", + "Format": "" + } + } +} \ No newline at end of file diff --git a/MP.SPEC/Recipe/Fimat/TemplateOutput.tpl b/MP.SPEC/Recipe/Fimat/TemplateOutput.tpl new file mode 100644 index 00000000..99e3d023 --- /dev/null +++ b/MP.SPEC/Recipe/Fimat/TemplateOutput.tpl @@ -0,0 +1,11 @@ +{ + "A_Recipe": { + "DesRecipe": { + "DesData": { + [[TemplateHead.json]] + }, + "ColRecipe": [ + [[TemplateRows.json]] + ] + } +} \ No newline at end of file diff --git a/MP.SPEC/Recipe/Fimat/TemplateRows.json b/MP.SPEC/Recipe/Fimat/TemplateRows.json new file mode 100644 index 00000000..bfb3539c --- /dev/null +++ b/MP.SPEC/Recipe/Fimat/TemplateRows.json @@ -0,0 +1,16 @@ +{ + "FixedData": { + "TypComp": "C", + "Weight-gr-prev": "0.00" + }, + "CalcData": { + "CompNumber": "#" + }, + "EditData": { + "ColourCode": "C001", + "Description": "COLOR1", + "PartsWeight": "1.00", + "PartsPerc": "0.10", + "Weight-gr": "30.00" + } +} \ No newline at end of file diff --git a/MP.SPEC/Recipe/Fimat/Recipe.json b/MP.SPEC/Recipe/Fimat/_RefRecipe.json similarity index 100% rename from MP.SPEC/Recipe/Fimat/Recipe.json rename to MP.SPEC/Recipe/Fimat/_RefRecipe.json From 58531691b558d03fb931ff75cb92588aa5832e5d Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 8 Feb 2023 09:52:24 +0100 Subject: [PATCH 26/50] Update conf --- MP.SPEC/Recipe/Fimat/RecipeConf.json | 117 ++++++++++++++++++++++++- MP.SPEC/Recipe/Fimat/TemplateRows.json | 40 ++++++--- 2 files changed, 141 insertions(+), 16 deletions(-) diff --git a/MP.SPEC/Recipe/Fimat/RecipeConf.json b/MP.SPEC/Recipe/Fimat/RecipeConf.json index dea24c34..ed7ba862 100644 --- a/MP.SPEC/Recipe/Fimat/RecipeConf.json +++ b/MP.SPEC/Recipe/Fimat/RecipeConf.json @@ -1,5 +1,116 @@ { - "TemplateFile": "TemplateOutput.tpl", - "HeadConf": "TemplateHead.json", - "RowsConf": "TemplateRows.json" + "TemplateFile": "TemplateOutput.tpl", + "HeadConf": { + "FixedKeys": { + "CustDrumCode": "", + "Taglio-N": "1", + "Taglio-D": "4", + "ServiceType": "N", + "RecipeType": "C", + "ViscoName": "", + "ViscoValue": "0" + }, + "CalcKeys": { + "LotID": "PODL01", + "OrderCode": "PODL02", + "Article": "Art2PODL01", + "Info1": "Art2PODL02" + }, + "EditKeys": { + "Prio": "Enum:Priority", + "DrumType": "Enum:DrumType", + "Customer": "Tenditalia", + "Design": "DESIGN", + "Screen": "SCREEN", + "Variant": "VARIANT", + "RecName": "CODE000", + "Series": "Enum:Series", + "UM": "Enum:UM", + "DosType": "Enum:DosType", + "Note1": "", + "Note2": "", + "Sequence": "1", + "SequenceTot": "8", + "Quantity-kg": "1.00" + }, + "EnumVal": { + "Priority": { + "N": "Normal", + "H": "Hight" + }, + "DrumType": { + "1": "Small", + "2": "Medium", + "3": "Big" + }, + "Series": { + "1": "Series 1", + "2": "Series 2" + }, + "UM": { + "0": "Percentage", + "1": "g/kg", + "2": "parts for colour and g/kg for thickener", + "3": "gr and parts for thickener", + "4": "g/kg for colour and parts for thickener", + "5": "parts for colour and parts for thickener" + }, + "DosType": { + "P": "Production", + "S": "Sampling" + } + }, + "CalcVal": { + "PODL01": { + "Description": "Idx PODL", + "Type": "int", + "Format": "{0}" + }, + "PODL02": { + "Description": "Codice PODL", + "Type": "string", + "Format": "PODL{0:00000000}" + }, + "Art2PODL01": { + "Description": "Codice Articolo dato PODL", + "Type": "string", + "Format": "" + }, + "Art2PODL02": { + "Description": "Descrizione Articolo dato PODL", + "Type": "string", + "Format": "" + } + } + }, + "RowsConf": { + "FixedKeys": { + "Weight-gr-prev": "0.00" + }, + "CalcKeys": { + "CompNumber": "#" + }, + "EditKeys": { + "ColourCode": "C001", + "Description": "COLOR1", + "TypComp": "ColType", + "PartsWeight": "1.00", + "PartsPerc": "0.10", + "Weight-gr": "30.00" + }, + "EnumVal": { + "ColType": { + "C": "Color", + "A": "Thickener", + "X": "Auxiliaries" + } + }, + "CalcVal": { + "#": { + "Description": "Contatore", + "Type": "int", + "Format": "{0}" + } + } + } } \ No newline at end of file diff --git a/MP.SPEC/Recipe/Fimat/TemplateRows.json b/MP.SPEC/Recipe/Fimat/TemplateRows.json index bfb3539c..c758fd22 100644 --- a/MP.SPEC/Recipe/Fimat/TemplateRows.json +++ b/MP.SPEC/Recipe/Fimat/TemplateRows.json @@ -1,16 +1,30 @@ { - "FixedData": { - "TypComp": "C", - "Weight-gr-prev": "0.00" - }, - "CalcData": { - "CompNumber": "#" - }, - "EditData": { - "ColourCode": "C001", - "Description": "COLOR1", - "PartsWeight": "1.00", - "PartsPerc": "0.10", - "Weight-gr": "30.00" + "FixedKeys": { + "Weight-gr-prev": "0.00" + }, + "CalcKeys": { + "CompNumber": "#" + }, + "EditKeys": { + "ColourCode": "C001", + "Description": "COLOR1", + "TypComp": "ColType", + "PartsWeight": "1.00", + "PartsPerc": "0.10", + "Weight-gr": "30.00" + }, + "EnumVal": { + "ColType": { + "C": "Color", + "A": "Thickener", + "X": "Auxiliaries" } + }, + "CalcVal": { + "#": { + "Description": "Contatore", + "Type": "int", + "Format": "{0}" + } + } } \ No newline at end of file From cc753023ea4c35201d7be804e7396765edda41ca Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 8 Feb 2023 09:52:43 +0100 Subject: [PATCH 27/50] Rimozione conf inutilizzata --- MP.SPEC/Recipe/Fimat/TemplateHead.json | 83 -------------------------- MP.SPEC/Recipe/Fimat/TemplateRows.json | 30 ---------- 2 files changed, 113 deletions(-) delete mode 100644 MP.SPEC/Recipe/Fimat/TemplateHead.json delete mode 100644 MP.SPEC/Recipe/Fimat/TemplateRows.json diff --git a/MP.SPEC/Recipe/Fimat/TemplateHead.json b/MP.SPEC/Recipe/Fimat/TemplateHead.json deleted file mode 100644 index c978f942..00000000 --- a/MP.SPEC/Recipe/Fimat/TemplateHead.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "FixedKeys": { - "CustDrumCode": "", - "Taglio-N": "1", - "Taglio-D": "4", - "ServiceType": "N", - "RecipeType": "C", - "ViscoName": "", - "ViscoValue": "0" - }, - "CalcKeys": { - "LotID": "PODL01", - "OrderCode": "PODL02", - "Article": "Art2PODL01", - "Info1": "Art2PODL02" - }, - "EditKeys": { - "Prio": "Enum:Priority", - "DrumType": "Enum:DrumType", - "Customer": "Tenditalia", - "Design": "DESIGN", - "Screen": "SCREEN", - "Variant": "VARIANT", - "RecName": "CODE000", - "Series": "Enum:Series", - "UM": "Enum:UM", - "DosType": "Enum:DosType", - "Note1": "", - "Note2": "", - "Sequence": "1", - "SequenceTot": "8", - "Quantity-kg": "1.00" - }, - "EnumVal": { - "Priority": { - "N": "Normal", - "H": "Hight" - }, - "DrumType": { - "1": "Small", - "2": "Medium", - "3": "Big" - }, - "Series": { - "1": "Series 1", - "2": "Series 2" - }, - "UM": { - "0": "Percentage", - "1": "g/kg", - "2": "parts for colour and g/kg for thickener", - "3": "gr and parts for thickener", - "4": "g/kg for colour and parts for thickener", - "5": "parts for colour and parts for thickener" - }, - "DosType": { - "P": "Production", - "S": "Sampling" - } - }, - "CalcVal": { - "PODL01": { - "Description": "Idx PODL", - "Type": "int", - "Format": "{0}" - }, - "PODL02": { - "Description": "Codice PODL", - "Type": "string", - "Format": "PODL{0:00000000}" - }, - "Art2PODL01": { - "Description": "Codice Articolo dato PODL", - "Type": "string", - "Format": "" - }, - "Art2PODL02": { - "Description": "Descrizione Articolo dato PODL", - "Type": "string", - "Format": "" - } - } -} \ No newline at end of file diff --git a/MP.SPEC/Recipe/Fimat/TemplateRows.json b/MP.SPEC/Recipe/Fimat/TemplateRows.json deleted file mode 100644 index c758fd22..00000000 --- a/MP.SPEC/Recipe/Fimat/TemplateRows.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "FixedKeys": { - "Weight-gr-prev": "0.00" - }, - "CalcKeys": { - "CompNumber": "#" - }, - "EditKeys": { - "ColourCode": "C001", - "Description": "COLOR1", - "TypComp": "ColType", - "PartsWeight": "1.00", - "PartsPerc": "0.10", - "Weight-gr": "30.00" - }, - "EnumVal": { - "ColType": { - "C": "Color", - "A": "Thickener", - "X": "Auxiliaries" - } - }, - "CalcVal": { - "#": { - "Description": "Contatore", - "Type": "int", - "Format": "{0}" - } - } -} \ No newline at end of file From 13adc7b4416ff68b55fdd8df528880fa99e4cf08 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 8 Feb 2023 09:52:48 +0100 Subject: [PATCH 28/50] Update gestione conf recipe --- MP.Data/Conf/RecipeConfig.cs | 3 + MP.Data/Controllers/MpMongoController.cs | 93 ++++++++++++++++++++++++ MP.Data/MP.Data.csproj | 1 + MP.Data/MgModels/RecipeModel.cs | 6 +- MP.SPEC/Components/ListPODL.razor | 2 +- MP.SPEC/Components/ListPODL.razor.cs | 21 ++++-- MP.SPEC/Components/RecipeMan.razor | 9 +++ MP.SPEC/Components/RecipeMan.razor.cs | 25 ++++++- MP.SPEC/Data/MpDataService.cs | 73 +++++++++++++++++++ MP.SPEC/MP.SPEC.csproj | 2 +- MP.SPEC/Resources/ChangeLog.html | 2 +- MP.SPEC/Resources/VersNum.txt | 2 +- MP.SPEC/Resources/manifest.xml | 2 +- MP.SPEC/appsettings.json | 3 +- 14 files changed, 227 insertions(+), 17 deletions(-) create mode 100644 MP.Data/Controllers/MpMongoController.cs diff --git a/MP.Data/Conf/RecipeConfig.cs b/MP.Data/Conf/RecipeConfig.cs index 0e19ea21..0e0a9e2a 100644 --- a/MP.Data/Conf/RecipeConfig.cs +++ b/MP.Data/Conf/RecipeConfig.cs @@ -8,6 +8,9 @@ namespace MP.Data.Conf { public class RecipeConfig { + /// + /// File di configurazione template ricetta + /// public string TemplateFile { get; set; } = ""; /// /// Configurazione ricetta x header diff --git a/MP.Data/Controllers/MpMongoController.cs b/MP.Data/Controllers/MpMongoController.cs new file mode 100644 index 00000000..785dec09 --- /dev/null +++ b/MP.Data/Controllers/MpMongoController.cs @@ -0,0 +1,93 @@ +using Microsoft.Extensions.Configuration; +using NLog; +using NLog.Fluent; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using MongoDB.Driver; +using MongoDB.Bson; +using MP.Data.MgModels; +using System.IO; +using MP.Data.Conf; +using Newtonsoft.Json; + +namespace MP.Data.Controllers +{ + public class MpMongoController : IDisposable + { + + public MpMongoController(IConfiguration configuration) + { + _configuration = configuration; + string mongoConf = _configuration.GetConnectionString("MongoConnect"); + client = new MongoClient(mongoConf); + Log.Info("Avviata classe MpMongoController"); + } + + public void Dispose() + { + client = null; + _configuration = null; + } + + /// + /// Ricerca ricetta su MongoDB dato PODL + /// + /// + /// + public async Task RecipeGetByPODL(int idxPODL) + { + await Task.Delay(1); + RecipeModel answ = new RecipeModel(); + return answ; + } + public async Task RecipeSetByPODL(RecipeModel currRecord) + { + await Task.Delay(1); + bool answ = false; + return answ; + } + + /// + /// Init ricetta dato PODL + conf + /// + /// + /// + public RecipeModel InitRecipe(int idxPODL, string confPath) + { + RecipeModel answ = new RecipeModel(); + // per prima cosa leggo file di conf x inizializzare ricetta... + string fullPath = RecipePath(confPath); + bool fileOk = File.Exists(fullPath); + if (fileOk) + { + string rawData = File.ReadAllText(fullPath); + var currRecipe = JsonConvert.DeserializeObject(rawData); + // copio la mia ricetta... + answ = new RecipeModel() + { + IdxPODL = idxPODL, + TemplateFile = currRecipe.TemplateFile, + HeadConf = currRecipe.HeadConf, + RowsConf = currRecipe.RowsConf + }; + } + + return answ; + } + + private MongoClient client = new MongoClient("mongodb://localhost:27017"); + + private static IConfiguration _configuration; + + private static NLog.Logger Log = LogManager.GetCurrentClassLogger(); + + public static string RecipePath(string ruleName) + { + return string.Format($"Recipe/{ruleName}"); + } + + } +} diff --git a/MP.Data/MP.Data.csproj b/MP.Data/MP.Data.csproj index 806b55f7..38c11edc 100644 --- a/MP.Data/MP.Data.csproj +++ b/MP.Data/MP.Data.csproj @@ -26,6 +26,7 @@ + \ No newline at end of file diff --git a/MP.Data/MgModels/RecipeModel.cs b/MP.Data/MgModels/RecipeModel.cs index 63f53ab1..0595e5fb 100644 --- a/MP.Data/MgModels/RecipeModel.cs +++ b/MP.Data/MgModels/RecipeModel.cs @@ -5,10 +5,11 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using MP.Data.Conf; namespace MP.Data.MgModels { - public class RecipeModel + public class RecipeModel : RecipeConfig { [BsonId] [BsonRepresentation(BsonType.ObjectId)] @@ -16,9 +17,8 @@ namespace MP.Data.MgModels public int IdxPODL { get; set; } = 0; public int IdxODL { get; set; } = 0; - public string TemplatePath { get; set; } = null!; - public string RawRecipe { get; set; } = null!; + public string RawRecipe { get; set; } = ""; } } diff --git a/MP.SPEC/Components/ListPODL.razor b/MP.SPEC/Components/ListPODL.razor index eaf09467..ada1a2d1 100644 --- a/MP.SPEC/Components/ListPODL.razor +++ b/MP.SPEC/Components/ListPODL.razor @@ -149,7 +149,7 @@ else @if (showRecipe && currRecord != null) {
                      - +
                      } diff --git a/MP.SPEC/Components/ListPODL.razor.cs b/MP.SPEC/Components/ListPODL.razor.cs index 1bb09f32..80719ed0 100644 --- a/MP.SPEC/Components/ListPODL.razor.cs +++ b/MP.SPEC/Components/ListPODL.razor.cs @@ -108,6 +108,13 @@ namespace MP.SPEC.Components await Task.Delay(1); } + protected async Task doShowRecipe(PODLExpModel selRec) + { + currRecord = selRec; + currRecipePath = await MDService.MacchineRecipe(selRec.IdxMacchina); + showRecipe = true; + } + protected override async Task OnInitializedAsync() { ListStati = await MDService.AnagStatiComm(); @@ -143,6 +150,7 @@ namespace MP.SPEC.Components protected async Task resetSel() { currRecord = null; + currRecipePath = ""; showRecipe = false; await RecordSel.InvokeAsync(null); } @@ -204,12 +212,6 @@ namespace MP.SPEC.Components } } - protected void doShowRecipe(PODLExpModel selRec) - { - showRecipe = true; - currRecord = selRec; - } - protected async Task UpdateData() { currRecord = null; @@ -222,6 +224,11 @@ namespace MP.SPEC.Components private static Logger Log = LogManager.GetCurrentClassLogger(); + /// + /// Percorso ricetta corrente + /// + private string currRecipePath = ""; + private PODLExpModel? currRecord = null; private List? ListRecords; @@ -421,7 +428,7 @@ namespace MP.SPEC.Components /// private async Task machineHasRecipe(string idxMacchina) { - string recipePath = await MDService.MacchineRecipe(idxMacchina); + var recipePath = await MDService.MacchineRecipe(idxMacchina); return !string.IsNullOrEmpty(recipePath); } diff --git a/MP.SPEC/Components/RecipeMan.razor b/MP.SPEC/Components/RecipeMan.razor index 53c84bc8..c472bdbf 100644 --- a/MP.SPEC/Components/RecipeMan.razor +++ b/MP.SPEC/Components/RecipeMan.razor @@ -1,2 +1,11 @@ 

                      RecipeMan

                      + +@if(CurrRecipe==null) +{ + +} +else +{ + dati ricetta +} diff --git a/MP.SPEC/Components/RecipeMan.razor.cs b/MP.SPEC/Components/RecipeMan.razor.cs index a16156d4..928517b5 100644 --- a/MP.SPEC/Components/RecipeMan.razor.cs +++ b/MP.SPEC/Components/RecipeMan.razor.cs @@ -15,6 +15,8 @@ using MP.SPEC; using MP.SPEC.Shared; using MP.SPEC.Components; using EgwCoreLib.Razor; +using MP.Data.MgModels; +using MP.SPEC.Data; namespace MP.SPEC.Components { @@ -22,8 +24,29 @@ namespace MP.SPEC.Components { [Parameter] - public int IdxOdl { get; set; } = 0; + public int IdxPODL { get; set; } = 0; + [Parameter] + public string RecipePath { get; set; } = ""; + [Inject] + protected MpDataService MDService { get; set; } = null!; + protected RecipeModel? CurrRecipe { get; set; } = null; + + protected override async Task OnParametersSetAsync() + { + await Task.Delay(1); + if (IdxPODL != 0 && !string.IsNullOrEmpty(RecipePath)) + { + RecipeModel CurrRecipe = new RecipeModel(); + // effettua ricerca ricetta su MongoDb + CurrRecipe = await MDService.RecipeGetByPODL(IdxPODL); + // se non trova crea nuova... + if (CurrRecipe == null || string.IsNullOrEmpty(CurrRecipe.Id)) + { + CurrRecipe = MDService.InitRecipe(IdxPODL, RecipePath); + } + } + } } } \ No newline at end of file diff --git a/MP.SPEC/Data/MpDataService.cs b/MP.SPEC/Data/MpDataService.cs index c583d9c8..f52df1b3 100644 --- a/MP.SPEC/Data/MpDataService.cs +++ b/MP.SPEC/Data/MpDataService.cs @@ -2,6 +2,7 @@ using MP.Data.Conf; using MP.Data.DatabaseModels; using MP.Data.DTO; +using MP.Data.MgModels; using Newtonsoft.Json; using NLog; using StackExchange.Redis; @@ -40,6 +41,18 @@ namespace MP.SPEC.Data dbController = new MP.Data.Controllers.MpSpecController(configuration); _logger.LogInformation("DbController OK"); } + + // conf mongo... + connStr = _configuration.GetConnectionString("MongoConnect"); + if (string.IsNullOrEmpty(connStr)) + { + _logger.LogError("MongoController: ConnString empty!"); + } + else + { + mongoController = new MP.Data.Controllers.MpMongoController(configuration); + _logger.LogInformation("MongoController OK"); + } } #endregion Public Constructors @@ -47,6 +60,7 @@ namespace MP.SPEC.Data #region Public Properties public static MP.Data.Controllers.MpSpecController dbController { get; set; } = null!; + public static MP.Data.Controllers.MpMongoController mongoController { get; set; } = null!; public MessagePipe BroadastMsgPipe { get; set; } = null!; @@ -57,6 +71,56 @@ namespace MP.SPEC.Data #endregion Public Properties + /// + /// Init ricetta + /// + /// + /// + /// + public RecipeModel InitRecipe(int idxPODL, string confPath) + { + return mongoController.InitRecipe(idxPODL, confPath); + } + /// + /// Ricerca ricetta su MongoDB dato PODL + /// + /// + /// + public async Task RecipeGetByPODL(int idxPODL) + { + RecipeModel result = new RecipeModel(); + Stopwatch stopWatch = new Stopwatch(); + stopWatch.Start(); + string readType = "DB"; + string currKey = $"{redisRecipeData}:{idxPODL}"; + // cerco in redis dato valore sel macchina... + RedisValue rawData = redisDb.StringGet(currKey); + if (rawData.HasValue) + { + var rawResult = JsonConvert.DeserializeObject($"{rawData}"); + if (rawResult != null) + { + result = rawResult; + } + readType = "REDIS"; + } + else + { + result = await mongoController.RecipeGetByPODL(idxPODL); + // serializzo e salvo... + rawData = JsonConvert.SerializeObject(result); + redisDb.StringSet(currKey, rawData, getRandTOut(redisShortTimeCache)); + } + if (result == null) + { + result = new RecipeModel(); + } + stopWatch.Stop(); + TimeSpan ts = stopWatch.Elapsed; + Log.Debug($"RecipeGetByPODL | Read from {readType}: {ts.TotalMilliseconds}ms"); + return result; + } + #region Public Methods /// @@ -379,10 +443,14 @@ namespace MP.SPEC.Data return await Task.FromResult(dbController.ConfigUpdate(updRec)); } + /// + /// Dispose del connettore ai dati + /// public void Dispose() { // Clear database controller dbController.Dispose(); + mongoController.Dispose(); redisConn.Dispose(); } @@ -1484,6 +1552,11 @@ namespace MP.SPEC.Data private const string redisTipoArt = redisBaseAddrSpec + "Cache:TipoArt"; private const string redisVocabolario = redisBaseAddrSpec + "Cache:Vocabolario"; private const string redisXdlData = redisBaseAddrSpec + "Cache:XDL:"; + + private const string redisRecipeConf = redisBaseAddrSpec + "Cache:Recipe:Conf"; + private const string redisRecipeData = redisBaseAddrSpec + "Cache:Recipe:Data"; + + private static IConfiguration _configuration = null!; private static ILogger _logger = null!; diff --git a/MP.SPEC/MP.SPEC.csproj b/MP.SPEC/MP.SPEC.csproj index ddbbd88b..6ba24e47 100644 --- a/MP.SPEC/MP.SPEC.csproj +++ b/MP.SPEC/MP.SPEC.csproj @@ -5,7 +5,7 @@ enable enable MP.SPEC - 6.16.2302.717 + 6.16.2302.809 diff --git a/MP.SPEC/Resources/ChangeLog.html b/MP.SPEC/Resources/ChangeLog.html index bb9f2529..37087c9c 100644 --- a/MP.SPEC/Resources/ChangeLog.html +++ b/MP.SPEC/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo MAPOSPEC -

                      Versione: 6.16.2302.717

                      +

                      Versione: 6.16.2302.809


                      Note di rilascio:
                      • diff --git a/MP.SPEC/Resources/VersNum.txt b/MP.SPEC/Resources/VersNum.txt index 47dea22b..860c0968 100644 --- a/MP.SPEC/Resources/VersNum.txt +++ b/MP.SPEC/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2302.717 +6.16.2302.809 diff --git a/MP.SPEC/Resources/manifest.xml b/MP.SPEC/Resources/manifest.xml index ee6a7450..6a63bc72 100644 --- a/MP.SPEC/Resources/manifest.xml +++ b/MP.SPEC/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2302.717 + 6.16.2302.809 https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/MP.SPEC.zip https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/ChangeLog.html false diff --git a/MP.SPEC/appsettings.json b/MP.SPEC/appsettings.json index 0bf7e81d..9c178563 100644 --- a/MP.SPEC/appsettings.json +++ b/MP.SPEC/appsettings.json @@ -11,7 +11,8 @@ "Mp.Data": "Server=SQL2016DEV;Database=MoonPro; User ID=sa;Password=keyhammer16; integrated security=False; MultipleActiveResultSets=True; App=MP.SPEC;", "Mp.Inve": "Server=SQL2016DEV;Database=MoonPro_MAG; User ID=sa;Password=keyhammer16; integrated security=False; MultipleActiveResultSets=True; App=MP.SPEC;", "Redis": "localhost:6379,DefaultDatabase=1,connectTimeout=5000,syncTimeout=5000,asyncTimeout=5000,abortConnect=false,ssl=false", - "RedisAdmin": "localhost:6379,DefaultDatabase=1,connectTimeout=5000,syncTimeout=5000,asyncTimeout=5000,abortConnect=false,ssl=false,allowAdmin=true" + "RedisAdmin": "localhost:6379,DefaultDatabase=1,connectTimeout=5000,syncTimeout=5000,asyncTimeout=5000,abortConnect=false,ssl=false,allowAdmin=true", + "MongoConnect": "mongodb://W2019-MONGODB:27017" }, "ServerConf": { "maxAge": "2000", From 1bfee37b4fa9ca799853e12fc346bff52b405e82 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 8 Feb 2023 10:37:24 +0100 Subject: [PATCH 29/50] SPEC: - Inizio a generare ricetta da template --- MP.Data/Conf/RecipeBlockConfig.cs | 16 +++----- MP.Data/Controllers/MpMongoController.cs | 13 ++++-- MP.Data/MgModels/RecipeModel.cs | 11 ++++++ MP.SPEC/Components/ListPODL.razor | 2 +- MP.SPEC/Components/ListPODL.razor.cs | 2 +- MP.SPEC/Components/RecipeMan.razor | 21 +++++++--- MP.SPEC/Components/RecipeMan.razor.cs | 8 +++- MP.SPEC/MP.SPEC.csproj | 2 +- MP.SPEC/Recipe/Fimat/RecipeConf.json | 50 ++++++++++-------------- MP.SPEC/Resources/ChangeLog.html | 2 +- MP.SPEC/Resources/VersNum.txt | 2 +- MP.SPEC/Resources/manifest.xml | 2 +- 12 files changed, 77 insertions(+), 54 deletions(-) diff --git a/MP.Data/Conf/RecipeBlockConfig.cs b/MP.Data/Conf/RecipeBlockConfig.cs index f95a879b..3cc966dc 100644 --- a/MP.Data/Conf/RecipeBlockConfig.cs +++ b/MP.Data/Conf/RecipeBlockConfig.cs @@ -12,17 +12,13 @@ namespace MP.Data.Conf public class RecipeBlockConfig { /// - /// Dizionario delle chiavi prefissate + /// Dizionario delle chiavi, differenziate dai primi caratteri: + /// [C] --> Calcolato + /// [F] --> Fixed (NON modificabile) + /// [E] --> Enum: modificabile ma da dizionario valori seguente + /// "" --> editabile /// - public Dictionary FixedKeys { get; set; } = new Dictionary(); - /// - /// Dizionario delle chiavi Calcolate - /// - public Dictionary CalcKeys { get; set; } = new Dictionary(); - /// - /// Dizionario delle chiavi Editabili - /// - public Dictionary EditKeys { get; set; } = new Dictionary(); + public Dictionary ListKeys { get; set; } = new Dictionary(); /// /// Dizionario degli enum permessi diff --git a/MP.Data/Controllers/MpMongoController.cs b/MP.Data/Controllers/MpMongoController.cs index 785dec09..b148332a 100644 --- a/MP.Data/Controllers/MpMongoController.cs +++ b/MP.Data/Controllers/MpMongoController.cs @@ -65,14 +65,21 @@ namespace MP.Data.Controllers { string rawData = File.ReadAllText(fullPath); var currRecipe = JsonConvert.DeserializeObject(rawData); - // copio la mia ricetta... + // copio la mia ricetta come conf... answ = new RecipeModel() { IdxPODL = idxPODL, TemplateFile = currRecipe.TemplateFile, HeadConf = currRecipe.HeadConf, - RowsConf = currRecipe.RowsConf + RowsConf = currRecipe.RowsConf, + HeadVal = currRecipe.HeadConf.ListKeys, + // aggiungo 1 riga... + RowsVal = new Dictionary>() + { + { 1, currRecipe.RowsConf.ListKeys} + } }; + } return answ; @@ -82,7 +89,7 @@ namespace MP.Data.Controllers private static IConfiguration _configuration; - private static NLog.Logger Log = LogManager.GetCurrentClassLogger(); + private static Logger Log = LogManager.GetCurrentClassLogger(); public static string RecipePath(string ruleName) { diff --git a/MP.Data/MgModels/RecipeModel.cs b/MP.Data/MgModels/RecipeModel.cs index 0595e5fb..13e3de31 100644 --- a/MP.Data/MgModels/RecipeModel.cs +++ b/MP.Data/MgModels/RecipeModel.cs @@ -18,6 +18,17 @@ namespace MP.Data.MgModels public int IdxPODL { get; set; } = 0; public int IdxODL { get; set; } = 0; + + /// + /// Dizionario chiavi/valori campi header + /// + public Dictionary HeadVal { get; set; } = new Dictionary(); + /// + /// Elenco righe ricetta (ogni riga dizionario chiavi/valori) + /// + public Dictionary> RowsVal { get; set; } = new Dictionary>(); + + public string RawRecipe { get; set; } = ""; } diff --git a/MP.SPEC/Components/ListPODL.razor b/MP.SPEC/Components/ListPODL.razor index ada1a2d1..d1a0f0b5 100644 --- a/MP.SPEC/Components/ListPODL.razor +++ b/MP.SPEC/Components/ListPODL.razor @@ -148,7 +148,7 @@ else @if (showRecipe && currRecord != null) { -
                        +
                        } diff --git a/MP.SPEC/Components/ListPODL.razor.cs b/MP.SPEC/Components/ListPODL.razor.cs index 80719ed0..354367ca 100644 --- a/MP.SPEC/Components/ListPODL.razor.cs +++ b/MP.SPEC/Components/ListPODL.razor.cs @@ -281,7 +281,7 @@ namespace MP.SPEC.Components private string mainCss { - get => showRecipe ? "col-8" : "col-12"; + get => showRecipe ? "col-6" : "col-12"; } private int numRecord diff --git a/MP.SPEC/Components/RecipeMan.razor b/MP.SPEC/Components/RecipeMan.razor index c472bdbf..2ff2117a 100644 --- a/MP.SPEC/Components/RecipeMan.razor +++ b/MP.SPEC/Components/RecipeMan.razor @@ -1,11 +1,22 @@ -

                        RecipeMan

                        - - -@if(CurrRecipe==null) +@if (isLoading) { } else { - dati ricetta +
                        +
                        +
                        Dati Ricetta
                        + @if (CurrRecipe?.HeadVal != null) + { +

                        testata: @CurrRecipe.HeadVal.Count valori

                        + } +
                        +
                        + @if (CurrRecipe?.RowsVal != null) + { +

                        righe: @CurrRecipe.RowsVal.Count valori

                        + } +
                        +
                        } diff --git a/MP.SPEC/Components/RecipeMan.razor.cs b/MP.SPEC/Components/RecipeMan.razor.cs index 928517b5..386d034a 100644 --- a/MP.SPEC/Components/RecipeMan.razor.cs +++ b/MP.SPEC/Components/RecipeMan.razor.cs @@ -33,12 +33,15 @@ namespace MP.SPEC.Components protected RecipeModel? CurrRecipe { get; set; } = null; + protected bool isLoading = false; + protected override async Task OnParametersSetAsync() { await Task.Delay(1); + isLoading = true; if (IdxPODL != 0 && !string.IsNullOrEmpty(RecipePath)) { - RecipeModel CurrRecipe = new RecipeModel(); + CurrRecipe = new RecipeModel(); // effettua ricerca ricetta su MongoDb CurrRecipe = await MDService.RecipeGetByPODL(IdxPODL); // se non trova crea nuova... @@ -47,6 +50,9 @@ namespace MP.SPEC.Components CurrRecipe = MDService.InitRecipe(IdxPODL, RecipePath); } } + await Task.Delay(1); + isLoading = false; + //await InvokeAsync(StateHasChanged); } } } \ No newline at end of file diff --git a/MP.SPEC/MP.SPEC.csproj b/MP.SPEC/MP.SPEC.csproj index 6ba24e47..77ad4dca 100644 --- a/MP.SPEC/MP.SPEC.csproj +++ b/MP.SPEC/MP.SPEC.csproj @@ -5,7 +5,7 @@ enable enable MP.SPEC - 6.16.2302.809 + 6.16.2302.810 diff --git a/MP.SPEC/Recipe/Fimat/RecipeConf.json b/MP.SPEC/Recipe/Fimat/RecipeConf.json index ed7ba862..f8f7beb7 100644 --- a/MP.SPEC/Recipe/Fimat/RecipeConf.json +++ b/MP.SPEC/Recipe/Fimat/RecipeConf.json @@ -1,32 +1,28 @@ { "TemplateFile": "TemplateOutput.tpl", "HeadConf": { - "FixedKeys": { - "CustDrumCode": "", - "Taglio-N": "1", - "Taglio-D": "4", - "ServiceType": "N", - "RecipeType": "C", - "ViscoName": "", - "ViscoValue": "0" - }, - "CalcKeys": { - "LotID": "PODL01", - "OrderCode": "PODL02", - "Article": "Art2PODL01", - "Info1": "Art2PODL02" - }, - "EditKeys": { - "Prio": "Enum:Priority", - "DrumType": "Enum:DrumType", + "ListKeys": { + "CustDrumCode": "F:", + "Taglio-N": "F:1", + "Taglio-D": "F:4", + "ServiceType": "F:N", + "RecipeType": "F:C", + "ViscoName": "F:", + "ViscoValue": "F:0", + "LotID": "C:PODL01", + "OrderCode": "C:PODL02", + "Article": "C:Art2PODL01", + "Info1": "C:Art2PODL02", + "Prio": "E:Priority", + "DrumType": "E:DrumType", "Customer": "Tenditalia", "Design": "DESIGN", "Screen": "SCREEN", "Variant": "VARIANT", "RecName": "CODE000", - "Series": "Enum:Series", - "UM": "Enum:UM", - "DosType": "Enum:DosType", + "Series": "E:Series", + "UM": "E:UM", + "DosType": "E:DosType", "Note1": "", "Note2": "", "Sequence": "1", @@ -84,16 +80,12 @@ } }, "RowsConf": { - "FixedKeys": { - "Weight-gr-prev": "0.00" - }, - "CalcKeys": { - "CompNumber": "#" - }, - "EditKeys": { + "ListKeys": { + "Weight-gr-prev": "F:0.00", + "CompNumber": "C:#", "ColourCode": "C001", "Description": "COLOR1", - "TypComp": "ColType", + "TypComp": "E:ColType", "PartsWeight": "1.00", "PartsPerc": "0.10", "Weight-gr": "30.00" diff --git a/MP.SPEC/Resources/ChangeLog.html b/MP.SPEC/Resources/ChangeLog.html index 37087c9c..be294f9d 100644 --- a/MP.SPEC/Resources/ChangeLog.html +++ b/MP.SPEC/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo MAPOSPEC -

                        Versione: 6.16.2302.809

                        +

                        Versione: 6.16.2302.810


                        Note di rilascio:
                        • diff --git a/MP.SPEC/Resources/VersNum.txt b/MP.SPEC/Resources/VersNum.txt index 860c0968..9411db86 100644 --- a/MP.SPEC/Resources/VersNum.txt +++ b/MP.SPEC/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2302.809 +6.16.2302.810 diff --git a/MP.SPEC/Resources/manifest.xml b/MP.SPEC/Resources/manifest.xml index 6a63bc72..70f4553d 100644 --- a/MP.SPEC/Resources/manifest.xml +++ b/MP.SPEC/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2302.809 + 6.16.2302.810 https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/MP.SPEC.zip https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/ChangeLog.html false From c92d8e00962cc8b88122e07b97cf00743436fb56 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 8 Feb 2023 15:38:42 +0100 Subject: [PATCH 30/50] Primo test spacchettamento ricetta --- MP.SPEC/Components/RecipeMan.razor | 27 +++++++++++++++++++++++++-- MP.SPEC/MP.SPEC.csproj | 2 +- MP.SPEC/Resources/ChangeLog.html | 2 +- MP.SPEC/Resources/VersNum.txt | 2 +- MP.SPEC/Resources/manifest.xml | 2 +- 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/MP.SPEC/Components/RecipeMan.razor b/MP.SPEC/Components/RecipeMan.razor index 2ff2117a..86e9e2ff 100644 --- a/MP.SPEC/Components/RecipeMan.razor +++ b/MP.SPEC/Components/RecipeMan.razor @@ -9,13 +9,36 @@ else
                          Dati Ricetta
                          @if (CurrRecipe?.HeadVal != null) { -

                          testata: @CurrRecipe.HeadVal.Count valori

                          +
                          + @foreach (var item in CurrRecipe.HeadVal) + { +
                          +
                          + + +
                          +
                          + } +
                          }
                        @if (CurrRecipe?.RowsVal != null) { -

                        righe: @CurrRecipe.RowsVal.Count valori

                        + @foreach (var riga in CurrRecipe.RowsVal) + { +
                        + @foreach (var item in riga.Value) + { +
                        +
                        + + +
                        +
                        + } +
                        + } }
                        diff --git a/MP.SPEC/MP.SPEC.csproj b/MP.SPEC/MP.SPEC.csproj index 77ad4dca..4a372ee7 100644 --- a/MP.SPEC/MP.SPEC.csproj +++ b/MP.SPEC/MP.SPEC.csproj @@ -5,7 +5,7 @@ enable enable MP.SPEC - 6.16.2302.810 + 6.16.2302.815 diff --git a/MP.SPEC/Resources/ChangeLog.html b/MP.SPEC/Resources/ChangeLog.html index be294f9d..500c0062 100644 --- a/MP.SPEC/Resources/ChangeLog.html +++ b/MP.SPEC/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo MAPOSPEC -

                        Versione: 6.16.2302.810

                        +

                        Versione: 6.16.2302.815


                        Note di rilascio:
                        • diff --git a/MP.SPEC/Resources/VersNum.txt b/MP.SPEC/Resources/VersNum.txt index 9411db86..654e02ac 100644 --- a/MP.SPEC/Resources/VersNum.txt +++ b/MP.SPEC/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2302.810 +6.16.2302.815 diff --git a/MP.SPEC/Resources/manifest.xml b/MP.SPEC/Resources/manifest.xml index 70f4553d..ce9cbcf3 100644 --- a/MP.SPEC/Resources/manifest.xml +++ b/MP.SPEC/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2302.810 + 6.16.2302.815 https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/MP.SPEC.zip https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/ChangeLog.html false From dde39d52dd6ff2ebc8bba73cf2d2d28eb20dacb0 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 8 Feb 2023 18:52:38 +0100 Subject: [PATCH 31/50] SPEC: - OK salvataggio ricetta in MongoDB --- MP.Data/Conf/RecipeBlockConfig.cs | 13 ++-- MP.Data/Controllers/MpMongoController.cs | 51 ++++++++++++-- MP.Data/MgModels/RecipeModel.cs | 86 +++++++++++++++++++++++- MP.SPEC/Components/RecipeMan.razor | 41 +++++++++-- MP.SPEC/Components/RecipeMan.razor.cs | 75 +++++++++++++++------ MP.SPEC/Data/MpDataService.cs | 11 +++ MP.SPEC/MP.SPEC.csproj | 2 +- MP.SPEC/Resources/ChangeLog.html | 2 +- MP.SPEC/Resources/VersNum.txt | 2 +- MP.SPEC/Resources/manifest.xml | 2 +- 10 files changed, 243 insertions(+), 42 deletions(-) diff --git a/MP.Data/Conf/RecipeBlockConfig.cs b/MP.Data/Conf/RecipeBlockConfig.cs index 3cc966dc..8c400c81 100644 --- a/MP.Data/Conf/RecipeBlockConfig.cs +++ b/MP.Data/Conf/RecipeBlockConfig.cs @@ -13,13 +13,14 @@ namespace MP.Data.Conf { /// /// Dizionario delle chiavi, differenziate dai primi caratteri: - /// [C] --> Calcolato - /// [F] --> Fixed (NON modificabile) - /// [E] --> Enum: modificabile ma da dizionario valori seguente + /// C: --> Calcolato + /// E: --> Enum: modificabile ma da dizionario valori seguente + /// F: --> Fixed (NON modificabile) /// "" --> editabile /// public Dictionary ListKeys { get; set; } = new Dictionary(); + /// /// Dizionario degli enum permessi /// @@ -31,9 +32,9 @@ namespace MP.Data.Conf public class CalcDetail { - public string Description { get; set; } = null!; - public string Type { get; set; } = null!; - public string Format { get; set; } = null!; + public string Description { get; set; } = ""; + public string Type { get; set; } = ""; + public string Format { get; set; } = ""; } } } diff --git a/MP.Data/Controllers/MpMongoController.cs b/MP.Data/Controllers/MpMongoController.cs index b148332a..7d371c81 100644 --- a/MP.Data/Controllers/MpMongoController.cs +++ b/MP.Data/Controllers/MpMongoController.cs @@ -12,6 +12,7 @@ using MP.Data.MgModels; using System.IO; using MP.Data.Conf; using Newtonsoft.Json; +using static MP.Data.MgModels.RecipeModel; namespace MP.Data.Controllers { @@ -23,8 +24,13 @@ namespace MP.Data.Controllers _configuration = configuration; string mongoConf = _configuration.GetConnectionString("MongoConnect"); client = new MongoClient(mongoConf); + mongoDb = client.GetDatabase("MAPO"); Log.Info("Avviata classe MpMongoController"); } + /// + /// Database corrente MongoDB + /// + private IMongoDatabase mongoDb; public void Dispose() { @@ -41,12 +47,45 @@ namespace MP.Data.Controllers { await Task.Delay(1); RecipeModel answ = new RecipeModel(); + try + { + // definisco filtro + var filtBuilder = Builders.Filter; + var filter = filtBuilder.Eq("IdxPODL", idxPODL); + var collectionData = mongoDb.GetCollection("RecipeArchive"); + // recupero + answ = collectionData.Find(filter).Project("{_id: 0}").FirstOrDefault(); + } + catch + { } return answ; } + /// + /// Salva ricetta su MongoDB + /// + /// + /// public async Task RecipeSetByPODL(RecipeModel currRecord) { await Task.Delay(1); bool answ = false; + try + { + // definisco filtro + var filtBuilder = Builders.Filter; + var filter = filtBuilder.Eq("IdxPODL", currRecord.IdxPODL); + var collectionData = mongoDb.GetCollection("RecipeArchive"); + // elimino old + collectionData.DeleteMany(filter); + // aggiungo + collectionData.InsertOne(currRecord); + answ = true; + } + catch(Exception exc) + { + Log.Error($"Eccezione in RecipeSetByPODL{Environment.NewLine}{exc}"); + } + return answ; } @@ -65,6 +104,8 @@ namespace MP.Data.Controllers { string rawData = File.ReadAllText(fullPath); var currRecipe = JsonConvert.DeserializeObject(rawData); + //// calcolo obj riga base (ne aggiungo1...) + //var rigaBase = RecipeModel.ConvertToObj(currRecipe.RowsConf.ListKeys); // copio la mia ricetta come conf... answ = new RecipeModel() { @@ -72,14 +113,16 @@ namespace MP.Data.Controllers TemplateFile = currRecipe.TemplateFile, HeadConf = currRecipe.HeadConf, RowsConf = currRecipe.RowsConf, - HeadVal = currRecipe.HeadConf.ListKeys, + //HeadVal = currRecipe.HeadConf.ListKeys, + HeadVal = RecipeModel.ConvertToObj(currRecipe.HeadConf.ListKeys), // aggiungo 1 riga... - RowsVal = new Dictionary>() + RowsVal = new Dictionary>() { - { 1, currRecipe.RowsConf.ListKeys} + //{ "1", rigaBase } + { "1", RecipeModel.ConvertToObj(currRecipe.RowsConf.ListKeys)} } }; - + } return answ; diff --git a/MP.Data/MgModels/RecipeModel.cs b/MP.Data/MgModels/RecipeModel.cs index 13e3de31..a81a8cd8 100644 --- a/MP.Data/MgModels/RecipeModel.cs +++ b/MP.Data/MgModels/RecipeModel.cs @@ -6,9 +6,11 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using MP.Data.Conf; +using System.ComponentModel.DataAnnotations.Schema; namespace MP.Data.MgModels { + [BsonIgnoreExtraElements] public class RecipeModel : RecipeConfig { [BsonId] @@ -19,15 +21,93 @@ namespace MP.Data.MgModels public int IdxODL { get; set; } = 0; + ///// + ///// Dizionario chiavi/valori campi header + ///// + //public Dictionary HeadVal { get; set; } = new Dictionary(); + + ///// + ///// Elenco righe ricetta (ogni riga dizionario chiavi/valori) + ///// + //public Dictionary> RowsVal { get; set; } = new Dictionary>(); + + + /// - /// Dizionario chiavi/valori campi header + /// Dizionario chiavi/valori estesi campi header /// - public Dictionary HeadVal { get; set; } = new Dictionary(); + public Dictionary HeadVal { get; set; } = new Dictionary(); + /// /// Elenco righe ricetta (ogni riga dizionario chiavi/valori) /// - public Dictionary> RowsVal { get; set; } = new Dictionary>(); + public Dictionary> RowsVal { get; set; } = new Dictionary>(); + /// + /// Inizializza la ListObj da ListKeys + /// + public static Dictionary ConvertToObj(Dictionary ListKeys) + { + Dictionary ListObj = ListKeys.ToDictionary(x => x.Key, x => new KeyConfig(x.Value)); + return ListObj; + } + + public class KeyConfig + { + /// + /// Init classe da valore raw + /// + /// + public KeyConfig(string rawValue) + { + this.OrigVal = rawValue; + this.Value = rawValue; + // cerco se ho uno dei 3 caratteri (C/E/F): + if (rawValue.Length >= 2 && rawValue.Substring(1, 1) == ":") + { + string selTipo = rawValue.Substring(0, 2); + switch (selTipo) + { + case "C:": + this.Type = KeyType.Calc; + this.Value = rawValue.Substring(2); + break; + case "E:": + this.Type = KeyType.Enum; + this.Value = ""; + this.EnumType = rawValue.Substring(2); + break; + case "F:": + this.Type = KeyType.Fixed; + this.Value = rawValue.Substring(2); + break; + default: + this.Type = KeyType.None; + break; + } + } + else + { + this.Type = KeyType.Free; + } + } + [NotMapped] + public KeyType Type { get; set; } = KeyType.None; + [NotMapped] + public string Value { get; set; } = ""; + [NotMapped] + public string EnumType { get; set; } = ""; + public string OrigVal { get; set; } = ""; + } + + public enum KeyType + { + None = 0, + Calc, + Enum, + Fixed, + Free + } public string RawRecipe { get; set; } = ""; diff --git a/MP.SPEC/Components/RecipeMan.razor b/MP.SPEC/Components/RecipeMan.razor index 86e9e2ff..e0aaedc2 100644 --- a/MP.SPEC/Components/RecipeMan.razor +++ b/MP.SPEC/Components/RecipeMan.razor @@ -4,25 +4,54 @@ } else { -
                          +
                          -
                          Dati Ricetta
                          +
                          Testata Ricetta
                          @if (CurrRecipe?.HeadVal != null) {
                          @foreach (var item in CurrRecipe.HeadVal) {
                          -
                          - - +
                          + @item.Key + @if (item.Value.Type == MP.Data.MgModels.RecipeModel.KeyType.Fixed) + { + + } + else if (item.Value.Type == MP.Data.MgModels.RecipeModel.KeyType.Enum) + { + + } + else + { + + }
                          }
                          +
                          +
                          +
                          + +
                          +
                          +
                          +
                          + +
                          +
                          +
                          }
                          +
                          Righe Ricetta
                          @if (CurrRecipe?.RowsVal != null) { @foreach (var riga in CurrRecipe.RowsVal) @@ -32,7 +61,7 @@ else {
                          - +
                          diff --git a/MP.SPEC/Components/RecipeMan.razor.cs b/MP.SPEC/Components/RecipeMan.razor.cs index 386d034a..0bfb29f4 100644 --- a/MP.SPEC/Components/RecipeMan.razor.cs +++ b/MP.SPEC/Components/RecipeMan.razor.cs @@ -1,20 +1,4 @@ -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 MP.SPEC; -using MP.SPEC.Shared; -using MP.SPEC.Components; -using EgwCoreLib.Razor; using MP.Data.MgModels; using MP.SPEC.Data; @@ -22,20 +6,72 @@ namespace MP.SPEC.Components { public partial class RecipeMan { + #region Public Properties [Parameter] public int IdxPODL { get; set; } = 0; + [Parameter] public string RecipePath { get; set; } = ""; + #endregion Public Properties + + #region Protected Fields + + protected bool isLoading = false; + + #endregion Protected Fields + + #region Protected Properties + + protected RecipeModel? CurrRecipe { get; set; } = null; + [Inject] protected MpDataService MDService { get; set; } = null!; - protected RecipeModel? CurrRecipe { get; set; } = null; + #endregion Protected Properties - protected bool isLoading = false; + #region Protected Methods + + protected async Task CancelHeadData() + { + await ReloadData(); + } + + protected Dictionary GetListByType(string DictType) + { + Dictionary answ = new Dictionary(); + // inn primis il "selezionare" + answ.Add("", "--- Selezionare ---"); + // cerco tipo in enums... + if (CurrRecipe != null && CurrRecipe.HeadConf.EnumVal.ContainsKey(DictType)) + { + foreach (var item in CurrRecipe.HeadConf.EnumVal[DictType]) + { + answ.Add(item.Key, item.Value); + } + } + return answ; + } protected override async Task OnParametersSetAsync() + { + await ReloadData(); + } + + protected async Task SaveHeadData() + { + if (CurrRecipe != null) + { + await MDService.RecipeSetByPODL(CurrRecipe); + } + } + + #endregion Protected Methods + + #region Private Methods + + private async Task ReloadData() { await Task.Delay(1); isLoading = true; @@ -52,7 +88,8 @@ namespace MP.SPEC.Components } await Task.Delay(1); isLoading = false; - //await InvokeAsync(StateHasChanged); } + + #endregion Private Methods } } \ No newline at end of file diff --git a/MP.SPEC/Data/MpDataService.cs b/MP.SPEC/Data/MpDataService.cs index f52df1b3..237c2f2b 100644 --- a/MP.SPEC/Data/MpDataService.cs +++ b/MP.SPEC/Data/MpDataService.cs @@ -82,6 +82,17 @@ namespace MP.SPEC.Data return mongoController.InitRecipe(idxPODL, confPath); } /// + /// Salva ricetta su MongoDB + /// + /// + /// + public async Task RecipeSetByPODL(RecipeModel currRecord) + { + bool answ = false; + answ = await mongoController.RecipeSetByPODL(currRecord); + return answ; + } + /// /// Ricerca ricetta su MongoDB dato PODL /// /// diff --git a/MP.SPEC/MP.SPEC.csproj b/MP.SPEC/MP.SPEC.csproj index 4a372ee7..51fb6385 100644 --- a/MP.SPEC/MP.SPEC.csproj +++ b/MP.SPEC/MP.SPEC.csproj @@ -5,7 +5,7 @@ enable enable MP.SPEC - 6.16.2302.815 + 6.16.2302.818 diff --git a/MP.SPEC/Resources/ChangeLog.html b/MP.SPEC/Resources/ChangeLog.html index 500c0062..c1c0ae3f 100644 --- a/MP.SPEC/Resources/ChangeLog.html +++ b/MP.SPEC/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo MAPOSPEC -

                          Versione: 6.16.2302.815

                          +

                          Versione: 6.16.2302.818


                          Note di rilascio:
                          • diff --git a/MP.SPEC/Resources/VersNum.txt b/MP.SPEC/Resources/VersNum.txt index 654e02ac..8933711c 100644 --- a/MP.SPEC/Resources/VersNum.txt +++ b/MP.SPEC/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2302.815 +6.16.2302.818 diff --git a/MP.SPEC/Resources/manifest.xml b/MP.SPEC/Resources/manifest.xml index ce9cbcf3..2c233e02 100644 --- a/MP.SPEC/Resources/manifest.xml +++ b/MP.SPEC/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2302.815 + 6.16.2302.818 https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/MP.SPEC.zip https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/ChangeLog.html false From 7c00c2a55ce36d78ba5530508694341187a0bea4 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 8 Feb 2023 19:25:59 +0100 Subject: [PATCH 32/50] inizio modifica x semplificare (MAYBE) ricetta --- MP.Data/Controllers/MpMongoController.cs | 23 ++++++++--- MP.Data/MgModels/RecipeModel.cs | 52 +++++++++++++++--------- MP.SPEC/Components/RecipeMan.razor | 30 +++++++++++--- MP.SPEC/MP.SPEC.csproj | 2 +- MP.SPEC/Resources/ChangeLog.html | 2 +- MP.SPEC/Resources/VersNum.txt | 2 +- MP.SPEC/Resources/manifest.xml | 2 +- 7 files changed, 78 insertions(+), 35 deletions(-) diff --git a/MP.Data/Controllers/MpMongoController.cs b/MP.Data/Controllers/MpMongoController.cs index 7d371c81..bb626133 100644 --- a/MP.Data/Controllers/MpMongoController.cs +++ b/MP.Data/Controllers/MpMongoController.cs @@ -104,8 +104,6 @@ namespace MP.Data.Controllers { string rawData = File.ReadAllText(fullPath); var currRecipe = JsonConvert.DeserializeObject(rawData); - //// calcolo obj riga base (ne aggiungo1...) - //var rigaBase = RecipeModel.ConvertToObj(currRecipe.RowsConf.ListKeys); // copio la mia ricetta come conf... answ = new RecipeModel() { @@ -114,13 +112,26 @@ namespace MP.Data.Controllers HeadConf = currRecipe.HeadConf, RowsConf = currRecipe.RowsConf, //HeadVal = currRecipe.HeadConf.ListKeys, - HeadVal = RecipeModel.ConvertToObj(currRecipe.HeadConf.ListKeys), + HeadVal = RecipeModel.ConvertToValues(currRecipe.HeadConf.ListKeys), // aggiungo 1 riga... - RowsVal = new Dictionary>() + RowsVal = new Dictionary>() { - //{ "1", rigaBase } - { "1", RecipeModel.ConvertToObj(currRecipe.RowsConf.ListKeys)} + { "1", currRecipe.RowsConf.ListKeys} } + + + //IdxPODL = idxPODL, + //TemplateFile = currRecipe.TemplateFile, + //HeadConf = currRecipe.HeadConf, + //RowsConf = currRecipe.RowsConf, + ////HeadVal = currRecipe.HeadConf.ListKeys, + //HeadVal = RecipeModel.ConvertToObj(currRecipe.HeadConf.ListKeys), + //// aggiungo 1 riga... + //RowsVal = new Dictionary>() + //{ + // //{ "1", rigaBase } + // { "1", RecipeModel.ConvertToObj(currRecipe.RowsConf.ListKeys)} + //} }; } diff --git a/MP.Data/MgModels/RecipeModel.cs b/MP.Data/MgModels/RecipeModel.cs index a81a8cd8..e9f7389a 100644 --- a/MP.Data/MgModels/RecipeModel.cs +++ b/MP.Data/MgModels/RecipeModel.cs @@ -21,37 +21,49 @@ namespace MP.Data.MgModels public int IdxODL { get; set; } = 0; - ///// - ///// Dizionario chiavi/valori campi header - ///// - //public Dictionary HeadVal { get; set; } = new Dictionary(); - - ///// - ///// Elenco righe ricetta (ogni riga dizionario chiavi/valori) - ///// - //public Dictionary> RowsVal { get; set; } = new Dictionary>(); - - - /// - /// Dizionario chiavi/valori estesi campi header + /// Dizionario chiavi/valori campi header /// - public Dictionary HeadVal { get; set; } = new Dictionary(); + public Dictionary HeadVal { get; set; } = new Dictionary(); /// /// Elenco righe ricetta (ogni riga dizionario chiavi/valori) /// - public Dictionary> RowsVal { get; set; } = new Dictionary>(); + public Dictionary> RowsVal { get; set; } = new Dictionary>(); - /// - /// Inizializza la ListObj da ListKeys - /// - public static Dictionary ConvertToObj(Dictionary ListKeys) + + public static KeyConfig getToConfig(string rawVal) { - Dictionary ListObj = ListKeys.ToDictionary(x => x.Key, x => new KeyConfig(x.Value)); + return new KeyConfig(rawVal); + } + /// + /// Inizializza il dizionario dei valori + /// + public static Dictionary ConvertToValues(Dictionary ListKeys) + { + Dictionary ListObj = ListKeys.ToDictionary(x => x.Key, x => new KeyConfig(x.Value).Value); return ListObj; } + ///// + ///// Dizionario chiavi/valori estesi campi header + ///// + //public Dictionary HeadVal { get; set; } = new Dictionary(); + + ///// + ///// Elenco righe ricetta (ogni riga dizionario chiavi/valori) + ///// + //public Dictionary> RowsVal { get; set; } = new Dictionary>(); + + ///// + ///// Inizializza la ListObj da ListKeys + ///// + //public static Dictionary ConvertToObj(Dictionary ListKeys) + //{ + // Dictionary ListObj = ListKeys.ToDictionary(x => x.Key, x => new KeyConfig(x.Value)); + // return ListObj; + //} + public class KeyConfig { /// diff --git a/MP.SPEC/Components/RecipeMan.razor b/MP.SPEC/Components/RecipeMan.razor index e0aaedc2..e8713704 100644 --- a/MP.SPEC/Components/RecipeMan.razor +++ b/MP.SPEC/Components/RecipeMan.razor @@ -1,4 +1,5 @@ -@if (isLoading) +@using MP.Data.MgModels; +@if (isLoading) { } @@ -12,10 +13,29 @@ else
                            @foreach (var item in CurrRecipe.HeadVal) { + var currObj = RecipeModel.getToConfig(CurrRecipe.HeadConf.ListKeys[item.Key]);
                            @item.Key - @if (item.Value.Type == MP.Data.MgModels.RecipeModel.KeyType.Fixed) + @if (currObj.Type == MP.Data.MgModels.RecipeModel.KeyType.Fixed) + { + + } + else if (currObj.Type == MP.Data.MgModels.RecipeModel.KeyType.Enum) + { + + } + else + { + + } + + @*@if (item.Value.Type == MP.Data.MgModels.RecipeModel.KeyType.Fixed) { } @@ -31,7 +51,7 @@ else else { - } + }*@
                            } @@ -57,7 +77,7 @@ else @foreach (var riga in CurrRecipe.RowsVal) {
                            - @foreach (var item in riga.Value) + @*@foreach (var item in riga.Value) {
                            @@ -65,7 +85,7 @@ else
                            - } + }*@
                            } } diff --git a/MP.SPEC/MP.SPEC.csproj b/MP.SPEC/MP.SPEC.csproj index 51fb6385..f70a48d4 100644 --- a/MP.SPEC/MP.SPEC.csproj +++ b/MP.SPEC/MP.SPEC.csproj @@ -5,7 +5,7 @@ enable enable MP.SPEC - 6.16.2302.818 + 6.16.2302.819 diff --git a/MP.SPEC/Resources/ChangeLog.html b/MP.SPEC/Resources/ChangeLog.html index c1c0ae3f..b375fe14 100644 --- a/MP.SPEC/Resources/ChangeLog.html +++ b/MP.SPEC/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo MAPOSPEC -

                            Versione: 6.16.2302.818

                            +

                            Versione: 6.16.2302.819


                            Note di rilascio:
                            • diff --git a/MP.SPEC/Resources/VersNum.txt b/MP.SPEC/Resources/VersNum.txt index 8933711c..d488cccd 100644 --- a/MP.SPEC/Resources/VersNum.txt +++ b/MP.SPEC/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2302.818 +6.16.2302.819 diff --git a/MP.SPEC/Resources/manifest.xml b/MP.SPEC/Resources/manifest.xml index 2c233e02..992c6361 100644 --- a/MP.SPEC/Resources/manifest.xml +++ b/MP.SPEC/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2302.818 + 6.16.2302.819 https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/MP.SPEC.zip https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/ChangeLog.html false From 770420ee37653588f7f3a140bf750c2a8f895345 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Thu, 9 Feb 2023 10:15:28 +0100 Subject: [PATCH 33/50] Fix gestione ricetta - fig gestione dati <-> Mongo - fix grafico --- MP.Data/Conf/RecipeConfig.cs | 7 ++ MP.Data/Controllers/MpMongoController.cs | 56 +++++----- MP.Data/MgModels/RecipeModel.cs | 132 +++++++++++++++-------- MP.SPEC/Components/ListPODL.razor | 2 +- MP.SPEC/Components/RecipeMan.razor | 97 ++++++++++------- MP.SPEC/Components/RecipeMan.razor.cs | 30 +++++- MP.SPEC/Data/MpDataService.cs | 31 +----- MP.SPEC/MP.SPEC.csproj | 2 +- MP.SPEC/Recipe/Fimat/RecipeConf.json | 1 + MP.SPEC/Resources/ChangeLog.html | 2 +- MP.SPEC/Resources/VersNum.txt | 2 +- MP.SPEC/Resources/manifest.xml | 2 +- 12 files changed, 222 insertions(+), 142 deletions(-) diff --git a/MP.Data/Conf/RecipeConfig.cs b/MP.Data/Conf/RecipeConfig.cs index 0e0a9e2a..c6744cbd 100644 --- a/MP.Data/Conf/RecipeConfig.cs +++ b/MP.Data/Conf/RecipeConfig.cs @@ -12,10 +12,17 @@ namespace MP.Data.Conf /// File di configurazione template ricetta ///
                            public string TemplateFile { get; set; } = ""; + + /// + /// Numero di righe da creare x ricetta + /// + public int NumRow { get; set; } = 1; + /// /// Configurazione ricetta x header /// public RecipeBlockConfig HeadConf { get; set; } = new RecipeBlockConfig(); + /// /// Configurazione ricetta x rows /// diff --git a/MP.Data/Controllers/MpMongoController.cs b/MP.Data/Controllers/MpMongoController.cs index bb626133..d618879b 100644 --- a/MP.Data/Controllers/MpMongoController.cs +++ b/MP.Data/Controllers/MpMongoController.cs @@ -81,7 +81,7 @@ namespace MP.Data.Controllers collectionData.InsertOne(currRecord); answ = true; } - catch(Exception exc) + catch (Exception exc) { Log.Error($"Eccezione in RecipeSetByPODL{Environment.NewLine}{exc}"); } @@ -105,35 +105,35 @@ namespace MP.Data.Controllers string rawData = File.ReadAllText(fullPath); var currRecipe = JsonConvert.DeserializeObject(rawData); // copio la mia ricetta come conf... - answ = new RecipeModel() - { - IdxPODL = idxPODL, - TemplateFile = currRecipe.TemplateFile, - HeadConf = currRecipe.HeadConf, - RowsConf = currRecipe.RowsConf, - //HeadVal = currRecipe.HeadConf.ListKeys, - HeadVal = RecipeModel.ConvertToValues(currRecipe.HeadConf.ListKeys), - // aggiungo 1 riga... - RowsVal = new Dictionary>() - { - { "1", currRecipe.RowsConf.ListKeys} - } + answ = new RecipeModel(idxPODL, currRecipe); + //answ = new RecipeModel() + //{ + // IdxPODL = idxPODL, + // TemplateFile = currRecipe.TemplateFile, + // HeadConf = currRecipe.HeadConf, + // RowsConf = currRecipe.RowsConf, + // //HeadVal = currRecipe.HeadConf.ListKeys, + // HeadVal = RecipeModel.ConvertToValues(currRecipe.HeadConf.ListKeys), + // // aggiungo 1 riga... + // RowsVal = new Dictionary>() + // { + // { "1", currRecipe.RowsConf.ListKeys} + // } - //IdxPODL = idxPODL, - //TemplateFile = currRecipe.TemplateFile, - //HeadConf = currRecipe.HeadConf, - //RowsConf = currRecipe.RowsConf, - ////HeadVal = currRecipe.HeadConf.ListKeys, - //HeadVal = RecipeModel.ConvertToObj(currRecipe.HeadConf.ListKeys), - //// aggiungo 1 riga... - //RowsVal = new Dictionary>() - //{ - // //{ "1", rigaBase } - // { "1", RecipeModel.ConvertToObj(currRecipe.RowsConf.ListKeys)} - //} - }; - + // //IdxPODL = idxPODL, + // //TemplateFile = currRecipe.TemplateFile, + // //HeadConf = currRecipe.HeadConf, + // //RowsConf = currRecipe.RowsConf, + // ////HeadVal = currRecipe.HeadConf.ListKeys, + // //HeadVal = RecipeModel.ConvertToObj(currRecipe.HeadConf.ListKeys), + // //// aggiungo 1 riga... + // //RowsVal = new Dictionary>() + // //{ + // // //{ "1", rigaBase } + // // { "1", RecipeModel.ConvertToObj(currRecipe.RowsConf.ListKeys)} + // //} + //}; } return answ; diff --git a/MP.Data/MgModels/RecipeModel.cs b/MP.Data/MgModels/RecipeModel.cs index e9f7389a..90281e04 100644 --- a/MP.Data/MgModels/RecipeModel.cs +++ b/MP.Data/MgModels/RecipeModel.cs @@ -11,87 +11,131 @@ using System.ComponentModel.DataAnnotations.Schema; namespace MP.Data.MgModels { [BsonIgnoreExtraElements] - public class RecipeModel : RecipeConfig + public class RecipeModel { [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string? Id { get; set; } + /// + /// Idx PODL di riferimento + /// public int IdxPODL { get; set; } = 0; + /// + /// idx ODL di riferimento + /// public int IdxODL { get; set; } = 0; + /// + /// File di configurazione template ricetta + /// + public string TemplateFile { get; set; } = ""; + /// + /// Configurazione ricetta x header + /// + public RecipeBlockConfig HeadConf { get; set; } = new RecipeBlockConfig(); + /// + /// Configurazione ricetta x rows + /// + public RecipeBlockConfig RowsConf { get; set; } = new RecipeBlockConfig(); /// - /// Dizionario chiavi/valori campi header + /// Lista element x testata ricetta /// - public Dictionary HeadVal { get; set; } = new Dictionary(); + public List HeadVal { get; set; } = new List(); /// - /// Elenco righe ricetta (ogni riga dizionario chiavi/valori) + /// Dizionario di righe, ognuna come Lista element /// - public Dictionary> RowsVal { get; set; } = new Dictionary>(); + public Dictionary> RowsVal { get; set; } = new Dictionary>(); + /// + /// Init vuoto + /// + public RecipeModel() + { } - public static KeyConfig getToConfig(string rawVal) + /// + /// Init da configurazione di base + /// + /// + public RecipeModel(int IdxPODL, RecipeConfig origConfig) { - return new KeyConfig(rawVal); + this.IdxPODL = IdxPODL; + this.TemplateFile = origConfig.TemplateFile; + this.HeadConf = origConfig.HeadConf; + this.RowsConf = origConfig.RowsConf; + // init oggetti tipizzati da valori conf ricevuti + this.HeadVal = ElementConverter(origConfig.HeadConf.ListKeys); + // aggiungo righe elementi.. + for (int i = 1; i <= origConfig.NumRow; i++) + { + this.RowsVal.Add($"{i}", ElementConverter(origConfig.RowsConf.ListKeys)); + } + } + + public static Element getToConfig(string rawKey, string rawVal) + { + return new Element(rawKey, rawVal); } /// - /// Inizializza il dizionario dei valori + /// Converte il dizionario in List Element /// - public static Dictionary ConvertToValues(Dictionary ListKeys) + public static List ElementConverter(Dictionary ListKeys) { - Dictionary ListObj = ListKeys.ToDictionary(x => x.Key, x => new KeyConfig(x.Value).Value); + List ListObj = ListKeys + .Select(x => new Element(x.Key, x.Value)) + .ToList(); return ListObj; } - ///// - ///// Dizionario chiavi/valori estesi campi header - ///// - //public Dictionary HeadVal { get; set; } = new Dictionary(); - - ///// - ///// Elenco righe ricetta (ogni riga dizionario chiavi/valori) - ///// - //public Dictionary> RowsVal { get; set; } = new Dictionary>(); + /// + /// Ricetta in formato calcolato (string) + /// + public string CalcRecipe { get; set; } = ""; ///// ///// Inizializza la ListObj da ListKeys ///// - //public static Dictionary ConvertToObj(Dictionary ListKeys) + //public static Dictionary ConvertToObj(Dictionary ListKeys) //{ - // Dictionary ListObj = ListKeys.ToDictionary(x => x.Key, x => new KeyConfig(x.Value)); + // Dictionary ListObj = ListKeys.ToDictionary(x => x.Key, x => new Element(x.Value)); // return ListObj; //} - public class KeyConfig + /// + /// Elemento unitario con cui costruire la ricetta + /// + public class Element { /// - /// Init classe da valore raw + /// Init classe da valore kvp /// - /// - public KeyConfig(string rawValue) + /// + /// + public Element(string rawKey, string rawVal) { - this.OrigVal = rawValue; - this.Value = rawValue; + this.Key = rawKey; + this.OrigVal = rawVal; + this.Value = rawVal; // cerco se ho uno dei 3 caratteri (C/E/F): - if (rawValue.Length >= 2 && rawValue.Substring(1, 1) == ":") + if (rawVal.Length >= 2 && rawVal.Substring(1, 1) == ":") { - string selTipo = rawValue.Substring(0, 2); + string selTipo = rawVal.Substring(0, 2); switch (selTipo) { case "C:": this.Type = KeyType.Calc; - this.Value = rawValue.Substring(2); + this.Value = rawVal.Substring(2); break; case "E:": this.Type = KeyType.Enum; this.Value = ""; - this.EnumType = rawValue.Substring(2); + this.EnumType = rawVal.Substring(2); break; case "F:": this.Type = KeyType.Fixed; - this.Value = rawValue.Substring(2); + this.Value = rawVal.Substring(2); break; default: this.Type = KeyType.None; @@ -106,22 +150,26 @@ namespace MP.Data.MgModels [NotMapped] public KeyType Type { get; set; } = KeyType.None; [NotMapped] + public string Key { get; set; } = ""; + [NotMapped] public string Value { get; set; } = ""; [NotMapped] public string EnumType { get; set; } = ""; public string OrigVal { get; set; } = ""; + + /// + /// Tipi di valore ammessi + /// + public enum KeyType + { + None = 0, + Calc, + Enum, + Fixed, + Free + } } - public enum KeyType - { - None = 0, - Calc, - Enum, - Fixed, - Free - } - - public string RawRecipe { get; set; } = ""; } } diff --git a/MP.SPEC/Components/ListPODL.razor b/MP.SPEC/Components/ListPODL.razor index d1a0f0b5..51187a54 100644 --- a/MP.SPEC/Components/ListPODL.razor +++ b/MP.SPEC/Components/ListPODL.razor @@ -149,7 +149,7 @@ else @if (showRecipe && currRecord != null) {
                            - +
                            }
                          diff --git a/MP.SPEC/Components/RecipeMan.razor b/MP.SPEC/Components/RecipeMan.razor index e8713704..041f33bb 100644 --- a/MP.SPEC/Components/RecipeMan.razor +++ b/MP.SPEC/Components/RecipeMan.razor @@ -1,4 +1,5 @@ @using MP.Data.MgModels; + @if (isLoading) { @@ -7,24 +8,39 @@ else {
                          -
                          Testata Ricetta
                          - @if (CurrRecipe?.HeadVal != null) +
                          +
                          +
                          Testata Ricetta
                          +
                          +
                          + +
                          +
                          + @if (showHead && CurrRecipe?.HeadVal != null) {
                          @foreach (var item in CurrRecipe.HeadVal) { - var currObj = RecipeModel.getToConfig(CurrRecipe.HeadConf.ListKeys[item.Key]);
                          -
                          - @item.Key - @if (currObj.Type == MP.Data.MgModels.RecipeModel.KeyType.Fixed) +
                          + @*@item.Key*@ + @if (item.Type == RecipeModel.Element.KeyType.Fixed) { - + } - else if (currObj.Type == MP.Data.MgModels.RecipeModel.KeyType.Enum) + else if (item.Type == MP.Data.MgModels.RecipeModel.Element.KeyType.Enum) { - + @foreach (var enumItem in GetListByType(item.EnumType)) { } @@ -32,26 +48,9 @@ else } else { - + } - - @*@if (item.Value.Type == MP.Data.MgModels.RecipeModel.KeyType.Fixed) - { - - } - else if (item.Value.Type == MP.Data.MgModels.RecipeModel.KeyType.Enum) - { - - } - else - { - - }*@ +
                          } @@ -76,17 +75,37 @@ else { @foreach (var riga in CurrRecipe.RowsVal) { -
                          - @*@foreach (var item in riga.Value) - { -
                          -
                          - - -
                          -
                          - }*@ +
                          +
                          + Riga @riga.Key +
                          +
                          + +
                          + @if (showRows[riga.Key]) + { +
                          + @foreach (var item in riga.Value) + { +
                          +
                          + + +
                          +
                          + } +
                          + } } }
                          diff --git a/MP.SPEC/Components/RecipeMan.razor.cs b/MP.SPEC/Components/RecipeMan.razor.cs index 0bfb29f4..57d8a3c9 100644 --- a/MP.SPEC/Components/RecipeMan.razor.cs +++ b/MP.SPEC/Components/RecipeMan.razor.cs @@ -8,6 +8,9 @@ namespace MP.SPEC.Components { #region Public Properties + [Parameter] + public EventCallback CancelEvent { get; set; } + [Parameter] public int IdxPODL { get; set; } = 0; @@ -36,6 +39,7 @@ namespace MP.SPEC.Components protected async Task CancelHeadData() { await ReloadData(); + await CancelEvent.InvokeAsync(true); } protected Dictionary GetListByType(string DictType) @@ -69,6 +73,13 @@ namespace MP.SPEC.Components #endregion Protected Methods + #region Private Fields + + private bool showHead = false; + private Dictionary showRows = new Dictionary(); + + #endregion Private Fields + #region Private Methods private async Task ReloadData() @@ -81,15 +92,32 @@ namespace MP.SPEC.Components // effettua ricerca ricetta su MongoDb CurrRecipe = await MDService.RecipeGetByPODL(IdxPODL); // se non trova crea nuova... - if (CurrRecipe == null || string.IsNullOrEmpty(CurrRecipe.Id)) + if (CurrRecipe == null) { CurrRecipe = MDService.InitRecipe(IdxPODL, RecipePath); } + // sistemo lista bool x righe + showRows = new Dictionary(); + for (int i = 1; i <= CurrRecipe.RowsVal.Count; i++) + { + showRows.Add($"{i}", false); + } } await Task.Delay(1); isLoading = false; } + private void toggleHead() + { + showHead = !showHead; + } + + private async Task toggleRow(string rowNum) + { + showRows[rowNum] = !showRows[rowNum]; + await Task.Delay(1); + } + #endregion Private Methods } } \ No newline at end of file diff --git a/MP.SPEC/Data/MpDataService.cs b/MP.SPEC/Data/MpDataService.cs index 237c2f2b..a4b81b96 100644 --- a/MP.SPEC/Data/MpDataService.cs +++ b/MP.SPEC/Data/MpDataService.cs @@ -97,35 +97,13 @@ namespace MP.SPEC.Data ///
                        /// /// - public async Task RecipeGetByPODL(int idxPODL) + public async Task RecipeGetByPODL(int idxPODL) { - RecipeModel result = new RecipeModel(); + RecipeModel? result = null; Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); - string readType = "DB"; - string currKey = $"{redisRecipeData}:{idxPODL}"; - // cerco in redis dato valore sel macchina... - RedisValue rawData = redisDb.StringGet(currKey); - if (rawData.HasValue) - { - var rawResult = JsonConvert.DeserializeObject($"{rawData}"); - if (rawResult != null) - { - result = rawResult; - } - readType = "REDIS"; - } - else - { - result = await mongoController.RecipeGetByPODL(idxPODL); - // serializzo e salvo... - rawData = JsonConvert.SerializeObject(result); - redisDb.StringSet(currKey, rawData, getRandTOut(redisShortTimeCache)); - } - if (result == null) - { - result = new RecipeModel(); - } + string readType = "MongoDB"; + result = await mongoController.RecipeGetByPODL(idxPODL); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Debug($"RecipeGetByPODL | Read from {readType}: {ts.TotalMilliseconds}ms"); @@ -1565,7 +1543,6 @@ namespace MP.SPEC.Data private const string redisXdlData = redisBaseAddrSpec + "Cache:XDL:"; private const string redisRecipeConf = redisBaseAddrSpec + "Cache:Recipe:Conf"; - private const string redisRecipeData = redisBaseAddrSpec + "Cache:Recipe:Data"; private static IConfiguration _configuration = null!; diff --git a/MP.SPEC/MP.SPEC.csproj b/MP.SPEC/MP.SPEC.csproj index f70a48d4..9b984ae1 100644 --- a/MP.SPEC/MP.SPEC.csproj +++ b/MP.SPEC/MP.SPEC.csproj @@ -5,7 +5,7 @@ enable enable MP.SPEC - 6.16.2302.819 + 6.16.2302.910 diff --git a/MP.SPEC/Recipe/Fimat/RecipeConf.json b/MP.SPEC/Recipe/Fimat/RecipeConf.json index f8f7beb7..91d6a62e 100644 --- a/MP.SPEC/Recipe/Fimat/RecipeConf.json +++ b/MP.SPEC/Recipe/Fimat/RecipeConf.json @@ -1,5 +1,6 @@ { "TemplateFile": "TemplateOutput.tpl", + "NumRow": 2, "HeadConf": { "ListKeys": { "CustDrumCode": "F:", diff --git a/MP.SPEC/Resources/ChangeLog.html b/MP.SPEC/Resources/ChangeLog.html index b375fe14..9c974915 100644 --- a/MP.SPEC/Resources/ChangeLog.html +++ b/MP.SPEC/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo MAPOSPEC -

                        Versione: 6.16.2302.819

                        +

                        Versione: 6.16.2302.910


                        Note di rilascio:
                        • diff --git a/MP.SPEC/Resources/VersNum.txt b/MP.SPEC/Resources/VersNum.txt index d488cccd..65b465e1 100644 --- a/MP.SPEC/Resources/VersNum.txt +++ b/MP.SPEC/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2302.819 +6.16.2302.910 diff --git a/MP.SPEC/Resources/manifest.xml b/MP.SPEC/Resources/manifest.xml index 992c6361..4c628f83 100644 --- a/MP.SPEC/Resources/manifest.xml +++ b/MP.SPEC/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2302.819 + 6.16.2302.910 https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/MP.SPEC.zip https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/ChangeLog.html false From 02f8a4100feb1ae199961ac255e5e30a05746293 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Thu, 9 Feb 2023 11:28:12 +0100 Subject: [PATCH 34/50] Update modello ricetta --- MP.Data/MgModels/RecipeModel.cs | 204 +++++++++++++++++--------- MP.Data/Utils.cs | 121 ++++++++------- MP.SPEC/Components/RecipeMan.razor | 54 ++++--- MP.SPEC/Components/RecipeMan.razor.cs | 33 ++++- MP.SPEC/MP.SPEC.csproj | 2 +- MP.SPEC/Resources/ChangeLog.html | 2 +- MP.SPEC/Resources/VersNum.txt | 2 +- MP.SPEC/Resources/manifest.xml | 2 +- 8 files changed, 265 insertions(+), 155 deletions(-) diff --git a/MP.Data/MgModels/RecipeModel.cs b/MP.Data/MgModels/RecipeModel.cs index 90281e04..edb97f91 100644 --- a/MP.Data/MgModels/RecipeModel.cs +++ b/MP.Data/MgModels/RecipeModel.cs @@ -1,53 +1,16 @@ -using MongoDB.Bson.Serialization.Attributes; -using MongoDB.Bson; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; using MP.Data.Conf; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; namespace MP.Data.MgModels { [BsonIgnoreExtraElements] public class RecipeModel { - [BsonId] - [BsonRepresentation(BsonType.ObjectId)] - public string? Id { get; set; } - - /// - /// Idx PODL di riferimento - /// - public int IdxPODL { get; set; } = 0; - /// - /// idx ODL di riferimento - /// - public int IdxODL { get; set; } = 0; - - /// - /// File di configurazione template ricetta - /// - public string TemplateFile { get; set; } = ""; - /// - /// Configurazione ricetta x header - /// - public RecipeBlockConfig HeadConf { get; set; } = new RecipeBlockConfig(); - /// - /// Configurazione ricetta x rows - /// - public RecipeBlockConfig RowsConf { get; set; } = new RecipeBlockConfig(); - - /// - /// Lista element x testata ricetta - /// - public List HeadVal { get; set; } = new List(); - - /// - /// Dizionario di righe, ognuna come Lista element - /// - public Dictionary> RowsVal { get; set; } = new Dictionary>(); + #region Public Constructors /// /// Init vuoto @@ -74,10 +37,58 @@ namespace MP.Data.MgModels } } - public static Element getToConfig(string rawKey, string rawVal) - { - return new Element(rawKey, rawVal); - } + #endregion Public Constructors + + #region Public Properties + + /// + /// Ricetta in formato calcolato (string) + /// + public string CalcRecipe { get; set; } = ""; + + /// + /// Configurazione ricetta x header + /// + public RecipeBlockConfig HeadConf { get; set; } = new RecipeBlockConfig(); + + /// + /// Lista element x testata ricetta + /// + public List HeadVal { get; set; } = new List(); + + [BsonId] + [BsonRepresentation(BsonType.ObjectId)] + public string? Id { get; set; } + + /// + /// idx ODL di riferimento + /// + public int IdxODL { get; set; } = 0; + + /// + /// Idx PODL di riferimento + /// + public int IdxPODL { get; set; } = 0; + + /// + /// Configurazione ricetta x rows + /// + public RecipeBlockConfig RowsConf { get; set; } = new RecipeBlockConfig(); + + /// + /// Dizionario di righe, ognuna come Lista element + /// + public Dictionary> RowsVal { get; set; } = new Dictionary>(); + + /// + /// File di configurazione template ricetta + /// + public string TemplateFile { get; set; } = ""; + + #endregion Public Properties + + #region Public Methods + /// /// Converte il dizionario in List Element /// @@ -89,25 +100,31 @@ namespace MP.Data.MgModels return ListObj; } - /// - /// Ricetta in formato calcolato (string) - /// - public string CalcRecipe { get; set; } = ""; + public static Element getToConfig(string rawKey, string rawVal) + { + return new Element(rawKey, rawVal); + } - ///// - ///// Inizializza la ListObj da ListKeys - ///// - //public static Dictionary ConvertToObj(Dictionary ListKeys) - //{ - // Dictionary ListObj = ListKeys.ToDictionary(x => x.Key, x => new Element(x.Value)); - // return ListObj; - //} + /// + /// Clone dell'oggetto + /// + /// + public RecipeModel Clone() + { + return (RecipeModel)this.MemberwiseClone(); + } + + #endregion Public Methods + + #region Public Classes /// /// Elemento unitario con cui costruire la ricetta /// public class Element { + #region Public Constructors + /// /// Init classe da valore kvp /// @@ -128,15 +145,18 @@ namespace MP.Data.MgModels this.Type = KeyType.Calc; this.Value = rawVal.Substring(2); break; + case "E:": this.Type = KeyType.Enum; this.Value = ""; this.EnumType = rawVal.Substring(2); break; + case "F:": this.Type = KeyType.Fixed; this.Value = rawVal.Substring(2); break; + default: this.Type = KeyType.None; break; @@ -147,16 +167,40 @@ namespace MP.Data.MgModels this.Type = KeyType.Free; } } - [NotMapped] - public KeyType Type { get; set; } = KeyType.None; - [NotMapped] - public string Key { get; set; } = ""; - [NotMapped] - public string Value { get; set; } = ""; - [NotMapped] - public string EnumType { get; set; } = ""; - public string OrigVal { get; set; } = ""; - + + #endregion Public Constructors + + + public override bool Equals(object obj) + { + if (!(obj is Element item)) + return false; + + if (Key != item.Key) + return false; + + if (Value != item.Value) + return false; + + if (OrigVal != item.OrigVal) + return false; + + if (Type != item.Type) + return false; + + if (EnumType != item.EnumType) + return false; + + return true; + } + + public override int GetHashCode() + { + return base.GetHashCode(); + } + + #region Public Enums + /// /// Tipi di valore ammessi /// @@ -168,8 +212,28 @@ namespace MP.Data.MgModels Fixed, Free } + + #endregion Public Enums + + #region Public Properties + + [NotMapped] + public string EnumType { get; set; } = ""; + + [NotMapped] + public string Key { get; set; } = ""; + + public string OrigVal { get; set; } = ""; + + [NotMapped] + public KeyType Type { get; set; } = KeyType.None; + + [NotMapped] + public string Value { get; set; } = ""; + + #endregion Public Properties } - + #endregion Public Classes } -} +} \ No newline at end of file diff --git a/MP.Data/Utils.cs b/MP.Data/Utils.cs index 7a400db0..ff70a27a 100644 --- a/MP.Data/Utils.cs +++ b/MP.Data/Utils.cs @@ -1,4 +1,5 @@ using MP.Data.DatabaseModels; +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel; @@ -42,6 +43,34 @@ namespace MP.Data return answ; } + public static string FormDurata(double durataMinuti) + { + string answ = ""; + TimeSpan tsDurata = TimeSpan.FromMinutes(durataMinuti); + if (tsDurata.TotalDays < 1) + { + answ = $"{tsDurata.Hours:00}h {tsDurata.Minutes:00}'"; + } + else + { + answ = $"{tsDurata.Days}gg {tsDurata.Hours:00}h"; + } + return answ; + } + + /// + /// Inizializzazione con periodo e arrotondamento + /// + /// + /// + public static DateTime InitDatetime(DateTime dtRif, int minRound) + { + TimeSpan DayElapsed = dtRif.Subtract(dtRif.Date); + int minDay = (int)Math.Ceiling((double)(DayElapsed.TotalMinutes / minRound)) * minRound; + DateTime endRounded = DateTime.Today.AddMinutes(minDay); + return endRounded; + } + /// /// Nome della variabile HASH da utilizzare (dato CodModulo / Server / DB impiegato da /// funzionalita' DbConfig) + keyName richiesto... @@ -78,65 +107,13 @@ namespace MP.Data await Task.Run(() => File.WriteAllLines(path, lines.ToArray())); } - /// - /// Inizializzazione con periodo e arrotondamento - /// - /// - /// - public static DateTime InitDatetime(DateTime dtRif, int minRound) - { - TimeSpan DayElapsed = dtRif.Subtract(dtRif.Date); - int minDay = (int)Math.Ceiling((double)(DayElapsed.TotalMinutes / minRound)) * minRound; - DateTime endRounded = DateTime.Today.AddMinutes(minDay); - return endRounded; - } + #endregion Public Methods - public static string FormDurata(double durataMinuti) - { - string answ = ""; - TimeSpan tsDurata = TimeSpan.FromMinutes(durataMinuti); - if (tsDurata.TotalDays < 1) - { - answ = $"{tsDurata.Hours:00}h {tsDurata.Minutes:00}'"; - } - else - { - answ = $"{tsDurata.Days}gg {tsDurata.Hours:00}h"; - } - return answ; - } + #region Public Classes public class POdlExt { - /// - /// Clona un POdleExt a POdl - /// - /// - /// - public static PODLModel convertToPOdl(PODLExpModel selRec) - { - // creo record duplicato... - PODLModel newRec = new PODLModel() - { - Attivabile = selRec.Attivabile, - CodArticolo = selRec.CodArticolo, - CodCli = selRec.CodCli, - CodGruppo = selRec.CodGruppo, - DueDate = selRec.DueDate, - IdxMacchina = selRec.IdxMacchina, - IdxOdl = selRec.IdxOdl, - IdxPromessa = selRec.IdxPromessa, - InsertDate = selRec.InsertDate, - KeyBCode = selRec.KeyBCode, - KeyRichiesta = selRec.KeyRichiesta, - Note = selRec.Note, - NumPezzi = selRec.NumPezzi, - Priorita = selRec.Priorita, - PzPallet = selRec.PzPallet, - Tcassegnato = selRec.Tcassegnato - }; - return newRec; - } + #region Public Methods /// /// Clona un POdleExt, tutti i valori (compreso idxOdl) @@ -167,8 +144,40 @@ namespace MP.Data }; return newRec; } + + /// + /// Clona un POdleExt a POdl + /// + /// + /// + public static PODLModel convertToPOdl(PODLExpModel selRec) + { + // creo record duplicato... + PODLModel newRec = new PODLModel() + { + Attivabile = selRec.Attivabile, + CodArticolo = selRec.CodArticolo, + CodCli = selRec.CodCli, + CodGruppo = selRec.CodGruppo, + DueDate = selRec.DueDate, + IdxMacchina = selRec.IdxMacchina, + IdxOdl = selRec.IdxOdl, + IdxPromessa = selRec.IdxPromessa, + InsertDate = selRec.InsertDate, + KeyBCode = selRec.KeyBCode, + KeyRichiesta = selRec.KeyRichiesta, + Note = selRec.Note, + NumPezzi = selRec.NumPezzi, + Priorita = selRec.Priorita, + PzPallet = selRec.PzPallet, + Tcassegnato = selRec.Tcassegnato + }; + return newRec; + } + + #endregion Public Methods } - #endregion Public Methods + #endregion Public Classes } } \ No newline at end of file diff --git a/MP.SPEC/Components/RecipeMan.razor b/MP.SPEC/Components/RecipeMan.razor index 041f33bb..4523c596 100644 --- a/MP.SPEC/Components/RecipeMan.razor +++ b/MP.SPEC/Components/RecipeMan.razor @@ -6,23 +6,40 @@ } else { -
                          +
                          -
                          Testata Ricetta
                          +

                          Testata Ricetta

                          - +
                          +
                          +
                          +
                          + +
                          +
                          } - else - { - - } - +
                          + +
                          +
                          @if (showHead && CurrRecipe?.HeadVal != null) @@ -35,7 +52,7 @@ else @*@item.Key*@ @if (item.Type == RecipeModel.Element.KeyType.Fixed) { - + } else if (item.Type == MP.Data.MgModels.RecipeModel.Element.KeyType.Enum) { @@ -48,25 +65,14 @@ else } else { - + } } -
                          -
                          -
                          - -
                          -
                          -
                          -
                          - -
                          -
                          -
                          + }
                          diff --git a/MP.SPEC/Components/RecipeMan.razor.cs b/MP.SPEC/Components/RecipeMan.razor.cs index 57d8a3c9..ee4825bb 100644 --- a/MP.SPEC/Components/RecipeMan.razor.cs +++ b/MP.SPEC/Components/RecipeMan.razor.cs @@ -1,6 +1,8 @@ using Microsoft.AspNetCore.Components; +using MP.Data; using MP.Data.MgModels; using MP.SPEC.Data; +using Newtonsoft.Json; namespace MP.SPEC.Components { @@ -28,6 +30,7 @@ namespace MP.SPEC.Components #region Protected Properties protected RecipeModel? CurrRecipe { get; set; } = null; + protected RecipeModel? OrigRecipe { get; set; } = null; [Inject] protected MpDataService MDService { get; set; } = null!; @@ -68,6 +71,7 @@ namespace MP.SPEC.Components if (CurrRecipe != null) { await MDService.RecipeSetByPODL(CurrRecipe); + await ReloadData(); } } @@ -75,7 +79,7 @@ namespace MP.SPEC.Components #region Private Fields - private bool showHead = false; + private bool showHead = true; private Dictionary showRows = new Dictionary(); #endregion Private Fields @@ -91,6 +95,7 @@ namespace MP.SPEC.Components CurrRecipe = new RecipeModel(); // effettua ricerca ricetta su MongoDb CurrRecipe = await MDService.RecipeGetByPODL(IdxPODL); + OrigRecipe = await MDService.RecipeGetByPODL(IdxPODL); // se non trova crea nuova... if (CurrRecipe == null) { @@ -107,6 +112,32 @@ namespace MP.SPEC.Components isLoading = false; } + private bool needSave + { + get + { + bool answ = false; + if (CurrRecipe != null && OrigRecipe != null) + { + answ = !(CurrRecipe.HeadVal.SequenceEqual(OrigRecipe.HeadVal)); + if (!answ) + { + foreach (var item in CurrRecipe.RowsVal) + { + answ = !(item.Value.SequenceEqual(OrigRecipe.RowsVal[item.Key])); + if (answ) + { + break; + } + } + } + } + return answ; + } + } + + + private void toggleHead() { showHead = !showHead; diff --git a/MP.SPEC/MP.SPEC.csproj b/MP.SPEC/MP.SPEC.csproj index 9b984ae1..af7d0f76 100644 --- a/MP.SPEC/MP.SPEC.csproj +++ b/MP.SPEC/MP.SPEC.csproj @@ -5,7 +5,7 @@ enable enable MP.SPEC - 6.16.2302.910 + 6.16.2302.911 diff --git a/MP.SPEC/Resources/ChangeLog.html b/MP.SPEC/Resources/ChangeLog.html index 9c974915..e93ffe87 100644 --- a/MP.SPEC/Resources/ChangeLog.html +++ b/MP.SPEC/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo MAPOSPEC -

                          Versione: 6.16.2302.910

                          +

                          Versione: 6.16.2302.911


                          Note di rilascio:
                          • diff --git a/MP.SPEC/Resources/VersNum.txt b/MP.SPEC/Resources/VersNum.txt index 65b465e1..37ed7d71 100644 --- a/MP.SPEC/Resources/VersNum.txt +++ b/MP.SPEC/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2302.910 +6.16.2302.911 diff --git a/MP.SPEC/Resources/manifest.xml b/MP.SPEC/Resources/manifest.xml index 4c628f83..d07e8bc4 100644 --- a/MP.SPEC/Resources/manifest.xml +++ b/MP.SPEC/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2302.910 + 6.16.2302.911 https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/MP.SPEC.zip https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/ChangeLog.html false From e3363d88f1a2063c44f14869061c3bb56115358f Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Thu, 9 Feb 2023 15:33:07 +0100 Subject: [PATCH 35/50] update readme x conf json --- MP.SPEC/Recipe/Fimat/RecipeConf.json | 39 ++++------------------------ 1 file changed, 5 insertions(+), 34 deletions(-) diff --git a/MP.SPEC/Recipe/Fimat/RecipeConf.json b/MP.SPEC/Recipe/Fimat/RecipeConf.json index 91d6a62e..ced4c417 100644 --- a/MP.SPEC/Recipe/Fimat/RecipeConf.json +++ b/MP.SPEC/Recipe/Fimat/RecipeConf.json @@ -10,10 +10,10 @@ "RecipeType": "F:C", "ViscoName": "F:", "ViscoValue": "F:0", - "LotID": "C:PODL01", - "OrderCode": "C:PODL02", - "Article": "C:Art2PODL01", - "Info1": "C:Art2PODL02", + "LotID": "C:IdxPODL", + "OrderCode": "C:CodePODL", + "Article": "C:CodArticolo", + "Info1": "C:DescArticolo", "Prio": "E:Priority", "DrumType": "E:DrumType", "Customer": "Tenditalia", @@ -56,34 +56,12 @@ "P": "Production", "S": "Sampling" } - }, - "CalcVal": { - "PODL01": { - "Description": "Idx PODL", - "Type": "int", - "Format": "{0}" - }, - "PODL02": { - "Description": "Codice PODL", - "Type": "string", - "Format": "PODL{0:00000000}" - }, - "Art2PODL01": { - "Description": "Codice Articolo dato PODL", - "Type": "string", - "Format": "" - }, - "Art2PODL02": { - "Description": "Descrizione Articolo dato PODL", - "Type": "string", - "Format": "" - } } }, "RowsConf": { "ListKeys": { "Weight-gr-prev": "F:0.00", - "CompNumber": "C:#", + "CompNumber": "C:RowNum", "ColourCode": "C001", "Description": "COLOR1", "TypComp": "E:ColType", @@ -97,13 +75,6 @@ "A": "Thickener", "X": "Auxiliaries" } - }, - "CalcVal": { - "#": { - "Description": "Contatore", - "Type": "int", - "Format": "{0}" - } } } } \ No newline at end of file From 57c61eac3bab2187d59f2c4451e382039a88cc4e Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Thu, 9 Feb 2023 15:33:11 +0100 Subject: [PATCH 36/50] Update gestioen ricetta --- MP.Data/Conf/RecipeBlockConfig.cs | 37 +++++-------- MP.Data/Controllers/MpMongoController.cs | 40 +++----------- MP.Data/Controllers/MpSpecController.cs | 1 + MP.Data/MgModels/RecipeModel.cs | 58 +++++++++++---------- MP.SPEC/Components/RecipeMan.razor | 63 +++++++++++++---------- MP.SPEC/Components/RecipeMan.razor.cs | 36 ++++++++++++- MP.SPEC/Data/MpDataService.cs | 7 +-- MP.SPEC/MP.SPEC.csproj | 2 +- MP.SPEC/Recipe/README.md | 23 +++++++++ MP.SPEC/Recipe/README.pdf | Bin 0 -> 42024 bytes MP.SPEC/Resources/ChangeLog.html | 2 +- MP.SPEC/Resources/VersNum.txt | 2 +- MP.SPEC/Resources/manifest.xml | 2 +- 13 files changed, 152 insertions(+), 121 deletions(-) create mode 100644 MP.SPEC/Recipe/README.md create mode 100644 MP.SPEC/Recipe/README.pdf diff --git a/MP.Data/Conf/RecipeBlockConfig.cs b/MP.Data/Conf/RecipeBlockConfig.cs index 8c400c81..b960fabc 100644 --- a/MP.Data/Conf/RecipeBlockConfig.cs +++ b/MP.Data/Conf/RecipeBlockConfig.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Collections.Generic; namespace MP.Data.Conf { @@ -11,30 +7,21 @@ namespace MP.Data.Conf ///
                          public class RecipeBlockConfig { - /// - /// Dizionario delle chiavi, differenziate dai primi caratteri: - /// C: --> Calcolato - /// E: --> Enum: modificabile ma da dizionario valori seguente - /// F: --> Fixed (NON modificabile) - /// "" --> editabile - /// - public Dictionary ListKeys { get; set; } = new Dictionary(); - + #region Public Properties /// /// Dizionario degli enum permessi /// public Dictionary> EnumVal { get; set; } = new Dictionary>(); - /// - /// Dizionario degli enum permessi - /// - public Dictionary CalcVal { get; set; } = new Dictionary(); - public class CalcDetail - { - public string Description { get; set; } = ""; - public string Type { get; set; } = ""; - public string Format { get; set; } = ""; - } + /// + /// Dizionario delle chiavi, differenziate dai primi caratteri: + /// C: --> Calcolato + /// E: --> Enum: modificabile ma da dizionario valori seguente + /// F: --> Fixed (NON modificabile) "" --> editabile + /// + public Dictionary ListKeys { get; set; } = new Dictionary(); + + #endregion Public Properties } -} +} \ No newline at end of file diff --git a/MP.Data/Controllers/MpMongoController.cs b/MP.Data/Controllers/MpMongoController.cs index d618879b..3dfaaeec 100644 --- a/MP.Data/Controllers/MpMongoController.cs +++ b/MP.Data/Controllers/MpMongoController.cs @@ -92,11 +92,15 @@ namespace MP.Data.Controllers /// /// Init ricetta dato PODL + conf /// - /// + /// + /// + /// /// - public RecipeModel InitRecipe(int idxPODL, string confPath) + public RecipeModel InitRecipe(string confPath, int idxPODL, Dictionary CalcArgs) { RecipeModel answ = new RecipeModel(); + // recupero dati da PODL... + // per prima cosa leggo file di conf x inizializzare ricetta... string fullPath = RecipePath(confPath); bool fileOk = File.Exists(fullPath); @@ -104,36 +108,8 @@ namespace MP.Data.Controllers { string rawData = File.ReadAllText(fullPath); var currRecipe = JsonConvert.DeserializeObject(rawData); - // copio la mia ricetta come conf... - answ = new RecipeModel(idxPODL, currRecipe); - - //answ = new RecipeModel() - //{ - // IdxPODL = idxPODL, - // TemplateFile = currRecipe.TemplateFile, - // HeadConf = currRecipe.HeadConf, - // RowsConf = currRecipe.RowsConf, - // //HeadVal = currRecipe.HeadConf.ListKeys, - // HeadVal = RecipeModel.ConvertToValues(currRecipe.HeadConf.ListKeys), - // // aggiungo 1 riga... - // RowsVal = new Dictionary>() - // { - // { "1", currRecipe.RowsConf.ListKeys} - // } - - // //IdxPODL = idxPODL, - // //TemplateFile = currRecipe.TemplateFile, - // //HeadConf = currRecipe.HeadConf, - // //RowsConf = currRecipe.RowsConf, - // ////HeadVal = currRecipe.HeadConf.ListKeys, - // //HeadVal = RecipeModel.ConvertToObj(currRecipe.HeadConf.ListKeys), - // //// aggiungo 1 riga... - // //RowsVal = new Dictionary>() - // //{ - // // //{ "1", rigaBase } - // // { "1", RecipeModel.ConvertToObj(currRecipe.RowsConf.ListKeys)} - // //} - //}; + // inizializzo dalla conf... + answ = new RecipeModel(idxPODL, currRecipe, CalcArgs); } return answ; diff --git a/MP.Data/Controllers/MpSpecController.cs b/MP.Data/Controllers/MpSpecController.cs index aef9d456..94b5d405 100644 --- a/MP.Data/Controllers/MpSpecController.cs +++ b/MP.Data/Controllers/MpSpecController.cs @@ -1034,6 +1034,7 @@ namespace MP.Data.Controllers .DbSetPODL .AsNoTracking() .Where(x => x.IdxPromessa == idxPODL) + .Include(a => a.ArticoloNav) .FirstOrDefault(); } catch (Exception exc) diff --git a/MP.Data/MgModels/RecipeModel.cs b/MP.Data/MgModels/RecipeModel.cs index edb97f91..afe67c56 100644 --- a/MP.Data/MgModels/RecipeModel.cs +++ b/MP.Data/MgModels/RecipeModel.cs @@ -21,19 +21,26 @@ namespace MP.Data.MgModels /// /// Init da configurazione di base /// - /// - public RecipeModel(int IdxPODL, RecipeConfig origConfig) + /// idx PODL + /// + /// Dizionario argomenti x decodifica (es cod articolo, descrizione...) + public RecipeModel(int IdxPODL, RecipeConfig OrigConfig, Dictionary CalcArgs) { this.IdxPODL = IdxPODL; - this.TemplateFile = origConfig.TemplateFile; - this.HeadConf = origConfig.HeadConf; - this.RowsConf = origConfig.RowsConf; + this.TemplateFile = OrigConfig.TemplateFile; + this.HeadConf = OrigConfig.HeadConf; + this.RowsConf = OrigConfig.RowsConf; // init oggetti tipizzati da valori conf ricevuti - this.HeadVal = ElementConverter(origConfig.HeadConf.ListKeys); + this.HeadVal = ElementConverter(OrigConfig.HeadConf.ListKeys, CalcArgs); + // aggiungo args x gestione contatori righe... + CalcArgs.Add("RowNum", $"0"); + CalcArgs.Add("RowTot", $"{OrigConfig.NumRow}"); // aggiungo righe elementi.. - for (int i = 1; i <= origConfig.NumRow; i++) + for (int i = 1; i <= OrigConfig.NumRow; i++) { - this.RowsVal.Add($"{i}", ElementConverter(origConfig.RowsConf.ListKeys)); + // valore calcolato numero riga gestito ad ogni iterazione + CalcArgs["RowNum"] = $"{i}"; + this.RowsVal.Add($"{i}", ElementConverter(OrigConfig.RowsConf.ListKeys, CalcArgs)); } } @@ -92,28 +99,14 @@ namespace MP.Data.MgModels /// /// Converte il dizionario in List Element /// - public static List ElementConverter(Dictionary ListKeys) + public static List ElementConverter(Dictionary ListKeys, Dictionary CalcArgs) { List ListObj = ListKeys - .Select(x => new Element(x.Key, x.Value)) + .Select(x => new Element(x.Key, x.Value, CalcArgs)) .ToList(); return ListObj; } - public static Element getToConfig(string rawKey, string rawVal) - { - return new Element(rawKey, rawVal); - } - - /// - /// Clone dell'oggetto - /// - /// - public RecipeModel Clone() - { - return (RecipeModel)this.MemberwiseClone(); - } - #endregion Public Methods #region Public Classes @@ -128,9 +121,9 @@ namespace MP.Data.MgModels /// /// Init classe da valore kvp /// - /// - /// - public Element(string rawKey, string rawVal) + /// Chiave item + /// Valore grezzo item + public Element(string rawKey, string rawVal, Dictionary CalcArgs) { this.Key = rawKey; this.OrigVal = rawVal; @@ -143,7 +136,16 @@ namespace MP.Data.MgModels { case "C:": this.Type = KeyType.Calc; - this.Value = rawVal.Substring(2); + // recupero item x ricerca in dizionario... + string cKey = rawVal.Substring(2); + if (CalcArgs.ContainsKey(cKey)) + { + this.Value = CalcArgs[cKey]; + } + else + { + this.Value = cKey; + } break; case "E:": diff --git a/MP.SPEC/Components/RecipeMan.razor b/MP.SPEC/Components/RecipeMan.razor index 4523c596..201de174 100644 --- a/MP.SPEC/Components/RecipeMan.razor +++ b/MP.SPEC/Components/RecipeMan.razor @@ -6,40 +6,32 @@ } else { -
                          +

                          Testata Ricetta

                          -
                          - @if (needSave) + @if (!showHead) + { + @CurrRecipe?.HeadVal.Count par + } + @if (needSave) + { + + + } + -
                          -
                          -
                          -
                          - -
                          -
                          + } -
                          - -
                          -
                          + else + { + + } +
                          @if (showHead && CurrRecipe?.HeadVal != null) @@ -76,7 +68,24 @@ else }
                          -
                          Righe Ricetta
                          +
                          +
                          +
                          Righe Ricetta
                          +
                          +
                          + + +
                          +
                          @if (CurrRecipe?.RowsVal != null) { @foreach (var riga in CurrRecipe.RowsVal) diff --git a/MP.SPEC/Components/RecipeMan.razor.cs b/MP.SPEC/Components/RecipeMan.razor.cs index ee4825bb..e9b40f1f 100644 --- a/MP.SPEC/Components/RecipeMan.razor.cs +++ b/MP.SPEC/Components/RecipeMan.razor.cs @@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Components; using MP.Data; using MP.Data.MgModels; using MP.SPEC.Data; +using MP.SPEC.Pages; using Newtonsoft.Json; namespace MP.SPEC.Components @@ -80,6 +81,7 @@ namespace MP.SPEC.Components #region Private Fields private bool showHead = true; + private bool showAllRows = false; private Dictionary showRows = new Dictionary(); #endregion Private Fields @@ -95,12 +97,27 @@ namespace MP.SPEC.Components CurrRecipe = new RecipeModel(); // effettua ricerca ricetta su MongoDb CurrRecipe = await MDService.RecipeGetByPODL(IdxPODL); - OrigRecipe = await MDService.RecipeGetByPODL(IdxPODL); // se non trova crea nuova... if (CurrRecipe == null) { - CurrRecipe = MDService.InitRecipe(IdxPODL, RecipePath); + // preparo dizionario valori calcolati + Dictionary CalcArgs = new Dictionary(); + // aggiungo dati PODL + CalcArgs.Add("IdxPODL", $"{IdxPODL}"); + CalcArgs.Add("CodePODL", $"PODL{IdxPODL:00000000}"); + // recupero altri dati da PODL + var rowPodl = await MDService.PODL_getByKey(IdxPODL); + if (rowPodl != null) + { + CalcArgs.Add("CodArticolo", rowPodl.CodArticolo); + CalcArgs.Add("DescArticolo", rowPodl.ArticoloNav.DescArticolo); + } + CurrRecipe = MDService.InitRecipe(RecipePath, IdxPODL, CalcArgs); + // la salvo... + await MDService.RecipeSetByPODL(CurrRecipe); } + // rileggo la default + OrigRecipe = await MDService.RecipeGetByPODL(IdxPODL); // sistemo lista bool x righe showRows = new Dictionary(); for (int i = 1; i <= CurrRecipe.RowsVal.Count; i++) @@ -136,6 +153,10 @@ namespace MP.SPEC.Components } } + private async Task addRow() + { + await Task.Delay(1); + } private void toggleHead() @@ -143,6 +164,17 @@ namespace MP.SPEC.Components showHead = !showHead; } + private async Task toggleRows() + { + showAllRows = !showAllRows; + foreach (var item in showRows) + { + showRows[item.Key] = showAllRows; + } + await Task.Delay(1); + } + + private async Task toggleRow(string rowNum) { showRows[rowNum] = !showRows[rowNum]; diff --git a/MP.SPEC/Data/MpDataService.cs b/MP.SPEC/Data/MpDataService.cs index a4b81b96..7554bd33 100644 --- a/MP.SPEC/Data/MpDataService.cs +++ b/MP.SPEC/Data/MpDataService.cs @@ -74,12 +74,13 @@ namespace MP.SPEC.Data /// /// Init ricetta /// - /// /// + /// + /// /// - public RecipeModel InitRecipe(int idxPODL, string confPath) + public RecipeModel InitRecipe(string confPath, int idxPODL, Dictionary CalcArgs) { - return mongoController.InitRecipe(idxPODL, confPath); + return mongoController.InitRecipe(confPath, idxPODL, CalcArgs); } /// /// Salva ricetta su MongoDB diff --git a/MP.SPEC/MP.SPEC.csproj b/MP.SPEC/MP.SPEC.csproj index af7d0f76..807f72ec 100644 --- a/MP.SPEC/MP.SPEC.csproj +++ b/MP.SPEC/MP.SPEC.csproj @@ -5,7 +5,7 @@ enable enable MP.SPEC - 6.16.2302.911 + 6.16.2302.915 diff --git a/MP.SPEC/Recipe/README.md b/MP.SPEC/Recipe/README.md new file mode 100644 index 00000000..9925615a --- /dev/null +++ b/MP.SPEC/Recipe/README.md @@ -0,0 +1,23 @@ +# Ricette +- [Ricette](#ricette) +- [Gestione formati e tag x ricette](#gestione-formati-e-tag-x-ricette) + - [Campi Calcolati](#campi-calcolati) + + +# Gestione formati e tag x ricette + +Nelle ricette ci possono essere campi liberi, campi da enum (da configurare nel json) e campi calcolati + + +## Campi Calcolati + +I tag noti x decodifica riguardano i campi calcolati; hard coded, e riconosciuti, sono i seguenti: + +| ID | Note | Format | Esempio | +|--------------|-----------------------------------------|------------------|-----------------| +| IdxPODL | IdxODL numerico | - | 123 | +| CodePODL | Codice alfanumerico partendo da IdxPODL | PODL{0:00000000} | PODL00000123 | +| CodArticolo | Campo CodArticolo | - | Art000123 | +| DescArticolo | Campo DescArticolo | - | Articol 123 blu | +| RowNum | Numero riga | - | 1 | +| RowTot | Totale righe | - | 10 | diff --git a/MP.SPEC/Recipe/README.pdf b/MP.SPEC/Recipe/README.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3f36eaff047a7e081abb000c5a346d7cbe3a433f GIT binary patch literal 42024 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%0AJj0qw*EKv?1`z=TloE;( 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 aJxwhqXG2Hl-xCXX*a(SSf)^<4-&Q literal 0 HcmV?d00001 diff --git a/MP.SPEC/Resources/ChangeLog.html b/MP.SPEC/Resources/ChangeLog.html index e93ffe87..f0ae4d97 100644 --- a/MP.SPEC/Resources/ChangeLog.html +++ b/MP.SPEC/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo MAPOSPEC -

                          Versione: 6.16.2302.911

                          +

                          Versione: 6.16.2302.915


                          Note di rilascio:
                          • diff --git a/MP.SPEC/Resources/VersNum.txt b/MP.SPEC/Resources/VersNum.txt index 37ed7d71..c653806e 100644 --- a/MP.SPEC/Resources/VersNum.txt +++ b/MP.SPEC/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2302.911 +6.16.2302.915 diff --git a/MP.SPEC/Resources/manifest.xml b/MP.SPEC/Resources/manifest.xml index d07e8bc4..69e5e3f5 100644 --- a/MP.SPEC/Resources/manifest.xml +++ b/MP.SPEC/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2302.911 + 6.16.2302.915 https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/MP.SPEC.zip https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/ChangeLog.html false From 14d4534e5c27b3c0c7291ed43d7553af7a52879a Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Thu, 9 Feb 2023 16:07:18 +0100 Subject: [PATCH 37/50] COmpletato editing ricette --- MP.Data/MgModels/RecipeModel.cs | 14 +++- MP.SPEC/Components/RecipeMan.razor | 11 ++- MP.SPEC/Components/RecipeMan.razor.cs | 111 ++++++++++++++++++++------ MP.SPEC/MP.SPEC.csproj | 2 +- MP.SPEC/Resources/ChangeLog.html | 2 +- MP.SPEC/Resources/VersNum.txt | 2 +- MP.SPEC/Resources/manifest.xml | 2 +- 7 files changed, 111 insertions(+), 33 deletions(-) diff --git a/MP.Data/MgModels/RecipeModel.cs b/MP.Data/MgModels/RecipeModel.cs index afe67c56..0c2d78a2 100644 --- a/MP.Data/MgModels/RecipeModel.cs +++ b/MP.Data/MgModels/RecipeModel.cs @@ -31,7 +31,7 @@ namespace MP.Data.MgModels this.HeadConf = OrigConfig.HeadConf; this.RowsConf = OrigConfig.RowsConf; // init oggetti tipizzati da valori conf ricevuti - this.HeadVal = ElementConverter(OrigConfig.HeadConf.ListKeys, CalcArgs); + this.HeadVal = ElementConverter(this.HeadConf.ListKeys, CalcArgs); // aggiungo args x gestione contatori righe... CalcArgs.Add("RowNum", $"0"); CalcArgs.Add("RowTot", $"{OrigConfig.NumRow}"); @@ -40,9 +40,19 @@ namespace MP.Data.MgModels { // valore calcolato numero riga gestito ad ogni iterazione CalcArgs["RowNum"] = $"{i}"; - this.RowsVal.Add($"{i}", ElementConverter(OrigConfig.RowsConf.ListKeys, CalcArgs)); + this.RowsVal.Add($"{i}", ElementConverter(this.RowsConf.ListKeys, CalcArgs)); } } + /// + /// Aggiunta righe + /// + /// + public List getNewRow(Dictionary CalcArgs) + { + List rowList = new List(); + rowList= ElementConverter(this.RowsConf.ListKeys, CalcArgs); + return rowList; + } #endregion Public Constructors diff --git a/MP.SPEC/Components/RecipeMan.razor b/MP.SPEC/Components/RecipeMan.razor index 201de174..8321f0e4 100644 --- a/MP.SPEC/Components/RecipeMan.razor +++ b/MP.SPEC/Components/RecipeMan.razor @@ -73,7 +73,7 @@ else
                            Righe Ricetta
                          - +
                          @if (CurrRecipe?.RowsVal != null) { + int rowTot = CurrRecipe.RowsVal.Count; + int rowNum = 0; @foreach (var riga in CurrRecipe.RowsVal) { + rowNum++;
                          - Riga @riga.Key + # @riga.Key
                          + @if (rowNum == rowTot) + { + + }
                          + Display @if (!showHead) { @CurrRecipe?.HeadVal.Count par @@ -41,15 +42,14 @@ else {
                          - @*@item.Key*@ - @if (item.Type == RecipeModel.Element.KeyType.Fixed) + @if (item.Type == RecipeModel.Element.KeyType.Fixed || item.Type == RecipeModel.Element.KeyType.Calc) { } else if (item.Type == MP.Data.MgModels.RecipeModel.Element.KeyType.Enum) { + @if (item.Type == RecipeModel.Element.KeyType.Fixed || item.Type == RecipeModel.Element.KeyType.Calc) + { + + } + else if (item.Type == MP.Data.MgModels.RecipeModel.Element.KeyType.Enum) + { + + } + else + { + + }
                          diff --git a/MP.SPEC/Components/RecipeMan.razor.cs b/MP.SPEC/Components/RecipeMan.razor.cs index b3a9199e..6fcb6e38 100644 --- a/MP.SPEC/Components/RecipeMan.razor.cs +++ b/MP.SPEC/Components/RecipeMan.razor.cs @@ -45,10 +45,10 @@ namespace MP.SPEC.Components await ReloadData(); } - protected Dictionary GetListByType(string DictType) + protected Dictionary GetHeadListByType(string DictType) { Dictionary answ = new Dictionary(); - // inn primis il "selezionare" + // in primis il "selezionare" answ.Add("", "--- Selezionare ---"); // cerco tipo in enums... if (CurrRecipe != null && CurrRecipe.HeadConf.EnumVal.ContainsKey(DictType)) @@ -60,6 +60,21 @@ namespace MP.SPEC.Components } return answ; } + protected Dictionary GetRowListByType(string DictType) + { + Dictionary answ = new Dictionary(); + // in primis il "selezionare" + answ.Add("", "--- Selezionare ---"); + // cerco tipo in enums... + if (CurrRecipe != null && CurrRecipe.RowsConf.EnumVal.ContainsKey(DictType)) + { + foreach (var item in CurrRecipe.RowsConf.EnumVal[DictType]) + { + answ.Add(item.Key, item.Value); + } + } + return answ; + } protected override async Task OnParametersSetAsync() { @@ -116,9 +131,12 @@ namespace MP.SPEC.Components { // sistemo lista bool x righe showRows = new Dictionary(); - for (int i = 1; i <= CurrRecipe.RowsVal.Count; i++) + if (CurrRecipe != null) { - showRows.Add($"{i}", false); + for (int i = 1; i <= CurrRecipe.RowsVal.Count; i++) + { + showRows.Add($"{i}", false); + } } } diff --git a/MP.SPEC/Controllers/RecipeController.cs b/MP.SPEC/Controllers/RecipeController.cs new file mode 100644 index 00000000..7ac28676 --- /dev/null +++ b/MP.SPEC/Controllers/RecipeController.cs @@ -0,0 +1,43 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Configuration; +using MP.Data.MgModels; +using MP.SPEC.Data; +using NLog; + +namespace MP.SPEC.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class RecipeController : ControllerBase + { + /// + /// Dataservice x accesso DB + /// + protected MpDataService DService { get; set; } + + public RecipeController(IConfiguration configuration, MpDataService DataService) + { + Log.Info("Starting MpDataService INIT"); + _configuration = configuration; + DService = DataService; + Log.Info("Avviata classe Recipe"); + + } + private static IConfiguration _configuration = null!; + + private static Logger Log = LogManager.GetCurrentClassLogger(); + + [HttpGet("GetRecipe")] + public async Task GetRecipe(int idxPODL) + { + string answ = ""; + var reqRecipe = await DService.RecipeGetByPODL(idxPODL); + if(reqRecipe!=null) + { + answ = DService.CalcRecipe(reqRecipe); + } + return answ; + } + } +} diff --git a/MP.SPEC/Data/MpDataService.cs b/MP.SPEC/Data/MpDataService.cs index 7554bd33..80e555e7 100644 --- a/MP.SPEC/Data/MpDataService.cs +++ b/MP.SPEC/Data/MpDataService.cs @@ -82,6 +82,7 @@ namespace MP.SPEC.Data { return mongoController.InitRecipe(confPath, idxPODL, CalcArgs); } + /// /// Salva ricetta su MongoDB /// @@ -111,6 +112,11 @@ namespace MP.SPEC.Data return result; } + public string CalcRecipe(RecipeModel currRecipe) + { + return mongoController.CalcRecipe(currRecipe); + } + #region Public Methods /// diff --git a/MP.SPEC/MP.SPEC.csproj b/MP.SPEC/MP.SPEC.csproj index a9fbdd60..42ad337e 100644 --- a/MP.SPEC/MP.SPEC.csproj +++ b/MP.SPEC/MP.SPEC.csproj @@ -5,7 +5,7 @@ enable enable MP.SPEC - 6.16.2302.916 + 6.16.2302.1311 @@ -17,7 +17,9 @@ - + + PreserveNewest + diff --git a/MP.SPEC/Program.cs b/MP.SPEC/Program.cs index 13deb26f..e650e8a4 100644 --- a/MP.SPEC/Program.cs +++ b/MP.SPEC/Program.cs @@ -65,7 +65,13 @@ app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); -app.MapBlazorHub(); -app.MapFallbackToPage("/_Host"); +app.UseEndpoints(endpoints => +{ + endpoints.MapControllers(); + endpoints.MapBlazorHub(); + endpoints.MapFallbackToPage("/_Host"); +}); +//app.MapBlazorHub(); +//app.MapFallbackToPage("/_Host"); app.Run(); diff --git a/MP.SPEC/Recipe/Fimat/RecipeConf.json b/MP.SPEC/Recipe/Fimat/RecipeConf.json index ced4c417..534d2a53 100644 --- a/MP.SPEC/Recipe/Fimat/RecipeConf.json +++ b/MP.SPEC/Recipe/Fimat/RecipeConf.json @@ -1,5 +1,5 @@ { - "TemplateFile": "TemplateOutput.tpl", + "TemplateFile": "Fimat/TemplateOutput.tpl", "NumRow": 2, "HeadConf": { "ListKeys": { diff --git a/MP.SPEC/Recipe/Fimat/TemplateOutput.tpl b/MP.SPEC/Recipe/Fimat/TemplateOutput.tpl index 99e3d023..a4adbb03 100644 --- a/MP.SPEC/Recipe/Fimat/TemplateOutput.tpl +++ b/MP.SPEC/Recipe/Fimat/TemplateOutput.tpl @@ -2,10 +2,13 @@ "A_Recipe": { "DesRecipe": { "DesData": { - [[TemplateHead.json]] + ||PlaceholderHeader|| }, - "ColRecipe": [ - [[TemplateRows.json]] - ] + "ColRecipe": [ + ||SROW:{"ColData":{|| + ||PlaceholderRows|| + ||EROW:}}|| + ] + } } } \ No newline at end of file diff --git a/MP.SPEC/Recipe/README.md b/MP.SPEC/Recipe/README.md index 9925615a..5f86f69b 100644 --- a/MP.SPEC/Recipe/README.md +++ b/MP.SPEC/Recipe/README.md @@ -1,13 +1,124 @@ # Ricette - [Ricette](#ricette) - [Gestione formati e tag x ricette](#gestione-formati-e-tag-x-ricette) + - [Definizione tag ricette](#definizione-tag-ricette) + - [Esempio tracciato Template](#esempio-tracciato-template) + - [Esempio tracciato configurazione complessivo](#esempio-tracciato-configurazione-complessivo) - [Campi Calcolati](#campi-calcolati) # Gestione formati e tag x ricette -Nelle ricette ci possono essere campi liberi, campi da enum (da configurare nel json) e campi calcolati +Nelle ricette ci possono essere campi liberi, campi da enum (da configurare nel json) e campi calcolati. +E' utile riportare un esempio di tracciato finale desiderato insieme ad un file template tpl da cui attingere x la realizzazione insieme ai campi definiti x testata e corpo. + +In particolare sia per testata che corpo sono indicati casi di dati enumerativi (in modo che sia usato uno tra i valori ammessi) + + +## Definizione tag ricette + +I tag ammessi x le ricette sono di seguito riassunti e definiti: + +| Cod | Significato | Definizione | +|-----|-------------|--------------------------------------------| +| C | Calcolato | Campo calcolato (NON modificabile) | +| E | Enum | IdxODL numerico | +| F | Fixed | IdxODL numerico | +| S | Suggested | Campo calcolato e suggerito (modificabile) | + +IN particolare gli Enum sono poi da riportare nella struttura degli EnumVal che deve completare i valori di testata o di corpo. + +## Esempio tracciato Template + +Ecco un esempio di template + +```csharp +{ + "A_Recipe": { + "DesRecipe": { + "DesData": { + ||PlaceholderHeader|| + }, + "ColRecipe": [ + ||SROW:{"ColData":{|| + ||PlaceholderRows|| + ||EROW":}}|| + ] + } +} +``` + +il blocco ||PlaceholderHeader|| verrà sostituito per intero dai valori di testata. + +Il blocco delel righe è invece più complesso e composto da 3 parti: + * nel primo blocco, ||SROW:{"ColData":{||, si cerca start riga e si prende il valore compreso tra ||SROW:: e || come testata riga da ripetere + * nel secondo blocco si sostituiscono tutti i valori della riga i-esima + * nel terzo blocco ||EROW":}}|| si sistema la chiusura della riga (end row) + + + +## Esempio tracciato configurazione complessivo + +```json +{ + "TemplateFile": "TemplateOutput.tpl", + "NumRow": 2, + "HeadConf": { + "ListKeys": { + "CustDrumCode": "F:", + "Taglio-N": "F:1", + "LotID": "C:IdxPODL", + "OrderCode": "C:CodePODL", + "Prio": "E:Priority", + "DrumType": "E:DrumType", + "Customer": "Tenditalia", + "Design": "DESIGN", + "Quantity-kg": "1.00" + }, + "EnumVal": { + "Priority": { + "N": "Normal", + "H": "Hight" + }, + "DrumType": { + "1": "Small", + "2": "Medium", + "3": "Big" + } + } + }, + "RowsConf": { + "ListKeys": { + "Weight-gr-prev": "F:0.00", + "CompNumber": "C:RowNum", + "ColourCode": "C001", + "Description": "COLOR1", + "TypComp": "E:ColType", + "PartsWeight": "1.00", + "PartsPerc": "0.10", + "Weight-gr": "30.00" + }, + "EnumVal": { + "ColType": { + "C": "Color", + "A": "Thickener", + "X": "Auxiliaries" + } + } + } +} +``` + +Come si può notare, il tracciato di configurazione comprende i seguenti blocchi: +| Blocco | descrizione | +|-------------------|--------------------------------------| +| HeadConf | Configurazione campi testata | +| HeadConf:ListKeys | Elenco chiavi/valori x testata | +| HeadConf:EnumVal | Elenco enumerativi ammessi x testata | +| RowsConf | Configurazione campi riga | +| RowsConf:ListKeys | Elenco chiavi/valori x righe | +| RowsConf:EnumVal | Elenco enumerativi ammessi x righe | ## Campi Calcolati diff --git a/MP.SPEC/Recipe/README.pdf b/MP.SPEC/Recipe/README.pdf index 3f36eaff047a7e081abb000c5a346d7cbe3a433f..02bb87f2864fa5531173b7dc44fcb107bf20f866 100644 GIT binary patch literal 71330 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 Im>l4L0Z`v*<^TWy delta 38770 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 HT1x)|qRub! diff --git a/MP.SPEC/Resources/ChangeLog.html b/MP.SPEC/Resources/ChangeLog.html index a5bd0cef..72eabcda 100644 --- a/MP.SPEC/Resources/ChangeLog.html +++ b/MP.SPEC/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo MAPOSPEC -

                          Versione: 6.16.2302.916

                          +

                          Versione: 6.16.2302.1311


                          Note di rilascio:
                          • diff --git a/MP.SPEC/Resources/VersNum.txt b/MP.SPEC/Resources/VersNum.txt index 0003f78b..67c61c02 100644 --- a/MP.SPEC/Resources/VersNum.txt +++ b/MP.SPEC/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2302.916 +6.16.2302.1311 diff --git a/MP.SPEC/Resources/manifest.xml b/MP.SPEC/Resources/manifest.xml index c322d1cd..2e44f23a 100644 --- a/MP.SPEC/Resources/manifest.xml +++ b/MP.SPEC/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2302.916 + 6.16.2302.1311 https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/MP.SPEC.zip https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/ChangeLog.html false From 5bf47fd0083bb7ab1d3b43600523aa782eaf8d15 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Mon, 13 Feb 2023 13:15:37 +0100 Subject: [PATCH 39/50] Ricetta: - aggiunta output XML - fix struttura dati --- MP.Data/Controllers/MpMongoController.cs | 4 ++-- MP.Data/MgModels/RecipeModel.cs | 4 +++- MP.SPEC/Components/RecipeMan.razor | 3 ++- MP.SPEC/Controllers/RecipeController.cs | 19 ++++++++++++++++++- MP.SPEC/MP.SPEC.csproj | 2 +- MP.SPEC/Pages/PODL.razor | 1 - MP.SPEC/Recipe/Fimat/TemplateOutput.tpl | 12 ++++++------ MP.SPEC/Resources/ChangeLog.html | 2 +- MP.SPEC/Resources/VersNum.txt | 2 +- MP.SPEC/Resources/manifest.xml | 2 +- 10 files changed, 35 insertions(+), 16 deletions(-) diff --git a/MP.Data/Controllers/MpMongoController.cs b/MP.Data/Controllers/MpMongoController.cs index baade6af..c51bd878 100644 --- a/MP.Data/Controllers/MpMongoController.cs +++ b/MP.Data/Controllers/MpMongoController.cs @@ -184,9 +184,9 @@ namespace MP.Data.Controllers foreach (var item in currRecipe.RowsVal) { var rowsStrings = item.Value.Select(x => $"\"{x.Key}\": \"{x.Value}\"").ToList(); - rowComp.Add($"{Environment.NewLine}{sRow}{string.Join(",", rowsStrings)}{eRow}"); + rowComp.Add($"{sRow}{string.Join(",", rowsStrings)}{eRow}"); } - string rowsVals = string.Join(",", rowComp); + string rowsVals = string.Join($",{Environment.NewLine}", rowComp); //...poi sostituisco answ = answ.Replace("||PlaceholderRows||", rowsVals); } diff --git a/MP.Data/MgModels/RecipeModel.cs b/MP.Data/MgModels/RecipeModel.cs index a4552080..1e64f17d 100644 --- a/MP.Data/MgModels/RecipeModel.cs +++ b/MP.Data/MgModels/RecipeModel.cs @@ -58,10 +58,12 @@ namespace MP.Data.MgModels #region Public Properties +#if false /// /// Ricetta in formato calcolato (string) /// - public string CalcRecipe { get; set; } = ""; + public string CalcRecipe { get; set; } = ""; +#endif /// /// Configurazione ricetta x header diff --git a/MP.SPEC/Components/RecipeMan.razor b/MP.SPEC/Components/RecipeMan.razor index 9e369147..60b1f72b 100644 --- a/MP.SPEC/Components/RecipeMan.razor +++ b/MP.SPEC/Components/RecipeMan.razor @@ -13,7 +13,8 @@ else

                            Testata Ricetta

                          - Display + XML + json @if (!showHead) { @CurrRecipe?.HeadVal.Count par diff --git a/MP.SPEC/Controllers/RecipeController.cs b/MP.SPEC/Controllers/RecipeController.cs index 7ac28676..9e8554da 100644 --- a/MP.SPEC/Controllers/RecipeController.cs +++ b/MP.SPEC/Controllers/RecipeController.cs @@ -3,7 +3,9 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using MP.Data.MgModels; using MP.SPEC.Data; +using Newtonsoft.Json; using NLog; +using System.Xml; namespace MP.SPEC.Controllers { @@ -33,11 +35,26 @@ namespace MP.SPEC.Controllers { string answ = ""; var reqRecipe = await DService.RecipeGetByPODL(idxPODL); - if(reqRecipe!=null) + if (reqRecipe != null) { answ = DService.CalcRecipe(reqRecipe); } return answ; } + [HttpGet("GetRecipeXML")] + public async Task GetRecipeXML(int idxPODL) + { + string answ = ""; + // recupero versione json + string rawData = await GetRecipe(idxPODL); + if (!string.IsNullOrEmpty(rawData)) + { + // aggiungo root node? + + XmlDocument doc = (XmlDocument)JsonConvert.DeserializeXmlNode(rawData); + answ += doc.InnerXml; + } + return answ; + } } } diff --git a/MP.SPEC/MP.SPEC.csproj b/MP.SPEC/MP.SPEC.csproj index 42ad337e..dd054b69 100644 --- a/MP.SPEC/MP.SPEC.csproj +++ b/MP.SPEC/MP.SPEC.csproj @@ -5,7 +5,7 @@ enable enable MP.SPEC - 6.16.2302.1311 + 6.16.2302.1313 diff --git a/MP.SPEC/Pages/PODL.razor b/MP.SPEC/Pages/PODL.razor index ff9d7e44..08476435 100644 --- a/MP.SPEC/Pages/PODL.razor +++ b/MP.SPEC/Pages/PODL.razor @@ -26,7 +26,6 @@ @if (filtActive) {
                          - @**@ @if (selReparto != "*") { diff --git a/MP.SPEC/Recipe/Fimat/TemplateOutput.tpl b/MP.SPEC/Recipe/Fimat/TemplateOutput.tpl index a4adbb03..512e709d 100644 --- a/MP.SPEC/Recipe/Fimat/TemplateOutput.tpl +++ b/MP.SPEC/Recipe/Fimat/TemplateOutput.tpl @@ -3,12 +3,12 @@ "DesRecipe": { "DesData": { ||PlaceholderHeader|| + } }, - "ColRecipe": [ - ||SROW:{"ColData":{|| - ||PlaceholderRows|| - ||EROW:}}|| - ] - } + "ColRecipe": [ + ||SROW:{"ColData":{|| + ||PlaceholderRows|| + ||EROW:}}|| + ] } } \ No newline at end of file diff --git a/MP.SPEC/Resources/ChangeLog.html b/MP.SPEC/Resources/ChangeLog.html index 72eabcda..f5c92414 100644 --- a/MP.SPEC/Resources/ChangeLog.html +++ b/MP.SPEC/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo MAPOSPEC -

                          Versione: 6.16.2302.1311

                          +

                          Versione: 6.16.2302.1313


                          Note di rilascio:
                          • diff --git a/MP.SPEC/Resources/VersNum.txt b/MP.SPEC/Resources/VersNum.txt index 67c61c02..5b8cb817 100644 --- a/MP.SPEC/Resources/VersNum.txt +++ b/MP.SPEC/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2302.1311 +6.16.2302.1313 diff --git a/MP.SPEC/Resources/manifest.xml b/MP.SPEC/Resources/manifest.xml index 2e44f23a..027ebd80 100644 --- a/MP.SPEC/Resources/manifest.xml +++ b/MP.SPEC/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2302.1311 + 6.16.2302.1313 https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/MP.SPEC.zip https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/ChangeLog.html false From 5461670a6f600fe34c9374155bd4c1dacd74e7d8 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Mon, 13 Feb 2023 13:15:48 +0100 Subject: [PATCH 40/50] Update nuget x altri progetti - INVE --- MP.INVE/MP.INVE.csproj | 8 ++++---- MP.INVE/Resources/ChangeLog.html | 2 +- MP.INVE/Resources/VersNum.txt | 2 +- MP.INVE/Resources/manifest.xml | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/MP.INVE/MP.INVE.csproj b/MP.INVE/MP.INVE.csproj index 04e8ed68..d66eb1c0 100644 --- a/MP.INVE/MP.INVE.csproj +++ b/MP.INVE/MP.INVE.csproj @@ -5,7 +5,7 @@ enable enable MP.INVE - 6.16.2302.316 + 6.16.2302.1313 @@ -18,10 +18,10 @@ - - + + - + diff --git a/MP.INVE/Resources/ChangeLog.html b/MP.INVE/Resources/ChangeLog.html index d72b423b..f82dd12e 100644 --- a/MP.INVE/Resources/ChangeLog.html +++ b/MP.INVE/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo MAPOINVE -

                            Versione: 6.16.2302.316

                            +

                            Versione: 6.16.2302.1313


                            Note di rilascio:
                            • diff --git a/MP.INVE/Resources/VersNum.txt b/MP.INVE/Resources/VersNum.txt index f4429b18..5b8cb817 100644 --- a/MP.INVE/Resources/VersNum.txt +++ b/MP.INVE/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2302.316 +6.16.2302.1313 diff --git a/MP.INVE/Resources/manifest.xml b/MP.INVE/Resources/manifest.xml index 3f8ef48b..85baf083 100644 --- a/MP.INVE/Resources/manifest.xml +++ b/MP.INVE/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2302.316 + 6.16.2302.1313 https://nexus.steamware.net/repository/SWS/MP-INVE/stable/LAST/MP.INVE.zip https://nexus.steamware.net/repository/SWS/MP-INVE/stable/LAST/ChangeLog.html false From 16257f51ab24aedb780a73311d6e1f39594763d3 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Mon, 13 Feb 2023 13:18:04 +0100 Subject: [PATCH 41/50] Fix CI/CD Stats --- MP.Stats/MP.Stats.csproj | 10 +++++----- MP.Stats/Resources/ChangeLog.html | 2 +- MP.Stats/Resources/VersNum.txt | 2 +- MP.Stats/Resources/manifest.xml | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/MP.Stats/MP.Stats.csproj b/MP.Stats/MP.Stats.csproj index cd1ea486..af252c93 100644 --- a/MP.Stats/MP.Stats.csproj +++ b/MP.Stats/MP.Stats.csproj @@ -4,8 +4,8 @@ net6.0 MP.Stats 826e877c-ba70-4253-84cb-d0b1cafd4440 - 6.16.2302.0317 - 6.16.2302.0317 + 6.16.2302.1313 + 6.16.2302.1313 @@ -186,13 +186,13 @@ - + - - + + diff --git a/MP.Stats/Resources/ChangeLog.html b/MP.Stats/Resources/ChangeLog.html index 33047e79..aa03ff46 100644 --- a/MP.Stats/Resources/ChangeLog.html +++ b/MP.Stats/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo statistiche MAPO -

                              Versione: 6.16.2302.0317

                              +

                              Versione: 6.16.2302.1313


                              Note di rilascio:
                                diff --git a/MP.Stats/Resources/VersNum.txt b/MP.Stats/Resources/VersNum.txt index b1be46c4..5b8cb817 100644 --- a/MP.Stats/Resources/VersNum.txt +++ b/MP.Stats/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2302.0317 +6.16.2302.1313 diff --git a/MP.Stats/Resources/manifest.xml b/MP.Stats/Resources/manifest.xml index f0068808..11cbb48e 100644 --- a/MP.Stats/Resources/manifest.xml +++ b/MP.Stats/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2302.0317 + 6.16.2302.1313 https://nexus.steamware.net/repository/SWS/MP-STATS/stable/LAST/MP.Stats.zip https://nexus.steamware.net/repository/SWS/MP-STATS/stable/LAST/ChangeLog.html false From 85823d2c0d3e59ebbf0b1b35fe23ad062d1746f4 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Mon, 13 Feb 2023 17:22:47 +0100 Subject: [PATCH 42/50] typo x test CI/CD --- MP.Mon/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MP.Mon/Program.cs b/MP.Mon/Program.cs index 2754d799..69561f56 100644 --- a/MP.Mon/Program.cs +++ b/MP.Mon/Program.cs @@ -6,7 +6,7 @@ using StackExchange.Redis; var builder = WebApplication.CreateBuilder(args); /*-------------------- - * Note migrazione startup.cs -_> program.cs: + * Note migrazione startup.cs --> program.cs: * * - https://stackoverflow.com/questions/69722872/asp-net-core-6-how-to-access-configuration-during-startup * - https://docs.microsoft.com/en-us/aspnet/core/migration/50-to-60?view=aspnetcore-5.0&tabs=visual-studio#where-do-i-put-state-that-was-stored-as-fields-in-my-program-or-startup-class From 32e5bc6050965a69749487298cd62055dacca64d Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Mon, 13 Feb 2023 17:27:18 +0100 Subject: [PATCH 43/50] Ancora cleanup --- MP.Mon/Program.cs | 1 - MP.Stats/MP.Stats.csproj | 4 ++-- MP.Stats/Resources/ChangeLog.html | 2 +- MP.Stats/Resources/VersNum.txt | 2 +- MP.Stats/Resources/manifest.xml | 2 +- 5 files changed, 5 insertions(+), 6 deletions(-) diff --git a/MP.Mon/Program.cs b/MP.Mon/Program.cs index 69561f56..dd7d4af9 100644 --- a/MP.Mon/Program.cs +++ b/MP.Mon/Program.cs @@ -26,7 +26,6 @@ builder.Services.AddRazorPages(); builder.Services.AddServerSideBlazor(); builder.Services.AddSingleton(redisMultiplexer); builder.Services.AddSingleton(); -//builder.Services.AddScoped(); var app = builder.Build(); diff --git a/MP.Stats/MP.Stats.csproj b/MP.Stats/MP.Stats.csproj index af252c93..67497766 100644 --- a/MP.Stats/MP.Stats.csproj +++ b/MP.Stats/MP.Stats.csproj @@ -4,8 +4,8 @@ net6.0 MP.Stats 826e877c-ba70-4253-84cb-d0b1cafd4440 - 6.16.2302.1313 - 6.16.2302.1313 + 6.16.2302.1317 + 6.16.2302.1317 diff --git a/MP.Stats/Resources/ChangeLog.html b/MP.Stats/Resources/ChangeLog.html index aa03ff46..cd2ab58c 100644 --- a/MP.Stats/Resources/ChangeLog.html +++ b/MP.Stats/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo statistiche MAPO -

                                Versione: 6.16.2302.1313

                                +

                                Versione: 6.16.2302.1317


                                Note di rilascio:
                                  diff --git a/MP.Stats/Resources/VersNum.txt b/MP.Stats/Resources/VersNum.txt index 5b8cb817..a0e080d2 100644 --- a/MP.Stats/Resources/VersNum.txt +++ b/MP.Stats/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2302.1313 +6.16.2302.1317 diff --git a/MP.Stats/Resources/manifest.xml b/MP.Stats/Resources/manifest.xml index 11cbb48e..3daa335d 100644 --- a/MP.Stats/Resources/manifest.xml +++ b/MP.Stats/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2302.1313 + 6.16.2302.1317 https://nexus.steamware.net/repository/SWS/MP-STATS/stable/LAST/MP.Stats.zip https://nexus.steamware.net/repository/SWS/MP-STATS/stable/LAST/ChangeLog.html false From 8752590131c4bce3daa4702a66ab2a61c4ae150e Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Mon, 13 Feb 2023 17:53:42 +0100 Subject: [PATCH 44/50] Ancora code cleanup --- IobConf.Core/IniFile.cs | 4 ++-- IobConf.Core/IobConf.Core.csproj | 4 ++-- IobConf.Core/IobConfTree.cs | 21 +++++++++++---------- MP.FileData/MP.FileData.csproj | 16 +++++++++------- MP.Land/MP.Land.csproj | 2 +- MP.Mon/MP.Mon.csproj | 7 +++---- MP.Mon/Resources/ChangeLog.html | 2 +- MP.Mon/Resources/VersNum.txt | 2 +- MP.Mon/Resources/manifest.xml | 2 +- MP.Prog/MP.Prog.csproj | 13 +++++++------ MP.Prog/Resources/ChangeLog.html | 2 +- MP.Prog/Resources/VersNum.txt | 2 +- MP.Prog/Resources/manifest.xml | 2 +- 13 files changed, 41 insertions(+), 38 deletions(-) diff --git a/IobConf.Core/IniFile.cs b/IobConf.Core/IniFile.cs index 1a0fc606..f02ee733 100644 --- a/IobConf.Core/IniFile.cs +++ b/IobConf.Core/IniFile.cs @@ -41,7 +41,7 @@ namespace IobConf.Core /// public void IniDeleteKey(string Section, string Key) { - WritePrivateProfileString(Section, Key, null, FileName); + WritePrivateProfileString(Section, Key, "", FileName); } /// @@ -50,7 +50,7 @@ namespace IobConf.Core /// public void IniDeleteSection(string Section) { - WritePrivateProfileSection(Section, null, FileName); + WritePrivateProfileSection(Section, "", FileName); } /// diff --git a/IobConf.Core/IobConf.Core.csproj b/IobConf.Core/IobConf.Core.csproj index 7361855e..d36839cf 100644 --- a/IobConf.Core/IobConf.Core.csproj +++ b/IobConf.Core/IobConf.Core.csproj @@ -8,8 +8,8 @@ - - + + diff --git a/IobConf.Core/IobConfTree.cs b/IobConf.Core/IobConfTree.cs index 7c76ca94..d169220a 100644 --- a/IobConf.Core/IobConfTree.cs +++ b/IobConf.Core/IobConfTree.cs @@ -19,7 +19,9 @@ namespace IobConf.Core /// Init classe configurazione /// public IobConfTree() - { } + { + Log = LogManager.GetCurrentClassLogger(); + } /// /// Restituisce un oggetto di conf leggendo INI ed effettuando conversione @@ -33,8 +35,8 @@ namespace IobConf.Core { // leggo file INI IniFile fIni = new IniFile(iniFilePath); - string codIob= Path.GetFileNameWithoutExtension(iniFilePath); - + string codIob = Path.GetFileNameWithoutExtension(iniFilePath); + // effettuo conversione... // Dati generali (vendor, modello...) @@ -46,13 +48,13 @@ namespace IobConf.Core // tipo adapter// verifico tipo adapter try { - newConfObj.IobType = (AdapterType)Enum.Parse(typeof(AdapterType), fIni.ReadString("IOB", "CNCTYPE", "ND")); + newConfObj.IobType = (AdapterType)Enum.Parse(typeof(AdapterType), fIni.ReadString("IOB", "CNCTYPE", "ND")); } catch (Exception exc) { newConfObj.IobType = AdapterType.ND; string rawVal = fIni.ReadString("IOB", "CNCTYPE", "DEMO"); - //newConfObj.lgError($"Eccezione in conversione tipo adapter: richiesto {rawVal} | tipo non codificato...{Environment.NewLine}{exc}"); + newConfObj.lgError($"Eccezione in conversione tipo adapter: richiesto {rawVal} | tipo non codificato...{Environment.NewLine}{exc}"); } newConfObj.GeneralCom = (ComLayer)Enum.Parse(typeof(ComLayer), fIni.ReadString("IOB", "CNCFAMILY", "ND")); @@ -72,16 +74,15 @@ namespace IobConf.Core newConfObj.TempoCiclo.MaxIncrPz = Convert.ToDouble(fIni.ReadString("OPTPAR", "TC_MAX_INCR", "5").Replace(".", ",")); // Server - string MpIp=fIni.ReadString("SERVER", "MPIP", "::1"); + string MpIp = fIni.ReadString("SERVER", "MPIP", "::1"); if (!string.IsNullOrEmpty(MpIp)) { newConfObj.ServerMES.Transport = MpIp.StartsWith("https://") ? "https" : "http"; newConfObj.ServerMES.IpAddr = MpIp.Replace($"{newConfObj.ServerMES.Transport}://", ""); // tolgo http/https... } - //newConfObj.ServerMES.Commands.Alive - + // Altro (versione, ...) - newConfObj.ReleaseVers = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(); + newConfObj.ReleaseVers = $"{System.Reflection.Assembly.GetExecutingAssembly().GetName().Version}"; newConfObj.IobManConf.MinDeltaSec = fIni.ReadInteger("IOB", "MinDeltaSec", 6); // OptPar @@ -101,7 +102,7 @@ namespace IobConf.Core } catch (Exception exc) { - //newConfObj.lgError(string.Format("EXCEPTION in fase di lettura OPTPAR: {0}{1}", Environment.NewLine, exc)); + newConfObj.lgError(string.Format("EXCEPTION in fase di lettura OPTPAR: {0}{1}", Environment.NewLine, exc)); } } // riordino alfabeticamente diff --git a/MP.FileData/MP.FileData.csproj b/MP.FileData/MP.FileData.csproj index 287fa655..529ef021 100644 --- a/MP.FileData/MP.FileData.csproj +++ b/MP.FileData/MP.FileData.csproj @@ -5,19 +5,21 @@ - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + + diff --git a/MP.Land/MP.Land.csproj b/MP.Land/MP.Land.csproj index f9e55a89..904d1238 100644 --- a/MP.Land/MP.Land.csproj +++ b/MP.Land/MP.Land.csproj @@ -52,7 +52,7 @@ - + diff --git a/MP.Mon/MP.Mon.csproj b/MP.Mon/MP.Mon.csproj index 536bb21c..b6682b6e 100644 --- a/MP.Mon/MP.Mon.csproj +++ b/MP.Mon/MP.Mon.csproj @@ -4,7 +4,7 @@ net6.0 enable enable - 6.16.2209.2118 + 6.16.2302.1317 @@ -29,9 +29,8 @@ - - - + + diff --git a/MP.Mon/Resources/ChangeLog.html b/MP.Mon/Resources/ChangeLog.html index 51fe82f4..9cee4eff 100644 --- a/MP.Mon/Resources/ChangeLog.html +++ b/MP.Mon/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo MON MAPO -

                                  Versione: 6.16.2209.2118

                                  +

                                  Versione: 6.16.2302.1317


                                  Note di rilascio:
                                  • diff --git a/MP.Mon/Resources/VersNum.txt b/MP.Mon/Resources/VersNum.txt index ebf3f94a..a0e080d2 100644 --- a/MP.Mon/Resources/VersNum.txt +++ b/MP.Mon/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2209.2118 +6.16.2302.1317 diff --git a/MP.Mon/Resources/manifest.xml b/MP.Mon/Resources/manifest.xml index 13b33d6f..e3b998f3 100644 --- a/MP.Mon/Resources/manifest.xml +++ b/MP.Mon/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2209.2118 + 6.16.2302.1317 https://nexus.steamware.net/repository/SWS/MP-MON/stable/LAST/MP.Mon.zip https://nexus.steamware.net/repository/SWS/MP-MON/stable/LAST/ChangeLog.html false diff --git a/MP.Prog/MP.Prog.csproj b/MP.Prog/MP.Prog.csproj index ae8af523..03a4f522 100644 --- a/MP.Prog/MP.Prog.csproj +++ b/MP.Prog/MP.Prog.csproj @@ -3,7 +3,7 @@ net6.0 MP.Prog - 6.16.2212.2917 + 6.16.2302.1317 @@ -17,14 +17,15 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - + + + + + diff --git a/MP.Prog/Resources/ChangeLog.html b/MP.Prog/Resources/ChangeLog.html index 88f38ae0..be3c27d3 100644 --- a/MP.Prog/Resources/ChangeLog.html +++ b/MP.Prog/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo gestione Programmi MAPO -

                                    Versione: 6.16.2212.2917

                                    +

                                    Versione: 6.16.2302.1317


                                    Note di rilascio:
                                      diff --git a/MP.Prog/Resources/VersNum.txt b/MP.Prog/Resources/VersNum.txt index 2641f650..a0e080d2 100644 --- a/MP.Prog/Resources/VersNum.txt +++ b/MP.Prog/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2212.2917 +6.16.2302.1317 diff --git a/MP.Prog/Resources/manifest.xml b/MP.Prog/Resources/manifest.xml index 966edd03..21989afb 100644 --- a/MP.Prog/Resources/manifest.xml +++ b/MP.Prog/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2212.2917 + 6.16.2302.1317 https://nexus.steamware.net/repository/SWS/MP-PROG/stable/LAST/MP.Prog.zip https://nexus.steamware.net/repository/SWS/MP-PROG/stable/LAST/ChangeLog.html false From 651a6da9ff52fac191a1e93adcbc06e11e1807de Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Mon, 13 Feb 2023 18:08:48 +0100 Subject: [PATCH 45/50] rinominata pwd iss salvata --- .gitlab-ci.yml | 42 +++++++++---------- MP.Mon/MP.Mon.csproj | 2 +- .../PublishProfiles/IIS01.pubxml.user | 3 +- MP.Mon/Resources/ChangeLog.html | 2 +- MP.Mon/Resources/VersNum.txt | 2 +- MP.Mon/Resources/manifest.xml | 2 +- 6 files changed, 27 insertions(+), 26 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ab1573d9..3286bd51 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -189,7 +189,7 @@ LAND:IIS01:deploy: needs: ["LAND:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj PROG:IIS01:deploy: stage: deploy @@ -206,7 +206,7 @@ PROG:IIS01:deploy: needs: ["PROG:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj STAT:IIS01:deploy: stage: deploy @@ -223,7 +223,7 @@ STAT:IIS01:deploy: needs: ["STAT:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj MON:IIS01:deploy: stage: deploy @@ -240,7 +240,7 @@ MON:IIS01:deploy: needs: ["MON:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj SPEC:IIS01:deploy: stage: deploy @@ -257,7 +257,7 @@ SPEC:IIS01:deploy: needs: ["SPEC:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj INVE:IIS01:deploy: stage: deploy @@ -274,7 +274,7 @@ INVE:IIS01:deploy: needs: ["INVE:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj CONF:IIS01:deploy: stage: deploy @@ -291,7 +291,7 @@ CONF:IIS01:deploy: needs: ["CONF:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj LAND:IIS02:deploy: stage: deploy @@ -308,8 +308,8 @@ LAND:IIS02:deploy: needs: ["LAND:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj PROG:IIS02:deploy: stage: deploy @@ -326,8 +326,8 @@ PROG:IIS02:deploy: needs: ["PROG:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj STAT:IIS02:deploy: stage: deploy @@ -344,8 +344,8 @@ STAT:IIS02:deploy: needs: ["STAT:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj MON:IIS02:deploy: stage: deploy @@ -362,8 +362,8 @@ MON:IIS02:deploy: needs: ["MON:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj SPEC:IIS02:deploy: stage: deploy @@ -380,8 +380,8 @@ SPEC:IIS02:deploy: needs: ["SPEC:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj INVE:IIS02:deploy: stage: deploy @@ -398,8 +398,8 @@ INVE:IIS02:deploy: needs: ["INVE:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj CONF:IIS02:deploy: stage: deploy @@ -416,8 +416,8 @@ CONF:IIS02:deploy: needs: ["CONF:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj LAND:installer: stage: installer diff --git a/MP.Mon/MP.Mon.csproj b/MP.Mon/MP.Mon.csproj index b6682b6e..f4f0ff8e 100644 --- a/MP.Mon/MP.Mon.csproj +++ b/MP.Mon/MP.Mon.csproj @@ -4,7 +4,7 @@ net6.0 enable enable - 6.16.2302.1317 + 6.16.2302.1318 diff --git a/MP.Mon/Properties/PublishProfiles/IIS01.pubxml.user b/MP.Mon/Properties/PublishProfiles/IIS01.pubxml.user index 9e79b53d..a00c7fec 100644 --- a/MP.Mon/Properties/PublishProfiles/IIS01.pubxml.user +++ b/MP.Mon/Properties/PublishProfiles/IIS01.pubxml.user @@ -7,6 +7,7 @@ by editing this MSBuild file. In order to learn more about this please visit htt AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAA+11nhJeDSkeTlSej+COD3AAAAAACAAAAAAADZgAAwAAAABAAAACFCXZ0UR7Czo59aaRCHU5QAAAAAASAAACgAAAAEAAAACYlKt9E6s77uEikpKwyhdQYAAAAUwae989LovFbsfjRp69HCVpyUQZbqLyYFAAAAMW8mLSAxWmKaOvB4nkDgUpS27/b - True|2022-07-12T14:34:20.2940329Z;True|2022-04-14T09:37:09.1341280+02:00;True|2022-02-26T18:24:32.0833123+01:00;False|2022-02-26T18:24:15.3994092+01:00;False|2022-02-26T18:23:44.8358586+01:00;True|2021-05-26T19:49:30.0427896+02:00;False|2021-05-26T19:49:14.9065510+02:00;True|2021-05-25T17:48:33.3901785+02:00;True|2021-05-25T17:46:09.2063020+02:00;True|2021-05-25T17:42:47.8167539+02:00;True|2021-05-25T17:22:03.1877438+02:00;True|2021-05-25T17:21:05.1565775+02:00;True|2021-05-25T16:26:34.1426996+02:00;True|2021-05-25T16:14:28.2842402+02:00;True|2021-05-25T15:02:11.7131495+02:00; + True|2023-02-13T17:05:04.7316718Z;True|2022-07-12T16:34:20.2940329+02:00;True|2022-04-14T09:37:09.1341280+02:00;True|2022-02-26T18:24:32.0833123+01:00;False|2022-02-26T18:24:15.3994092+01:00;False|2022-02-26T18:23:44.8358586+01:00;True|2021-05-26T19:49:30.0427896+02:00;False|2021-05-26T19:49:14.9065510+02:00;True|2021-05-25T17:48:33.3901785+02:00;True|2021-05-25T17:46:09.2063020+02:00;True|2021-05-25T17:42:47.8167539+02:00;True|2021-05-25T17:22:03.1877438+02:00;True|2021-05-25T17:21:05.1565775+02:00;True|2021-05-25T16:26:34.1426996+02:00;True|2021-05-25T16:14:28.2842402+02:00;True|2021-05-25T15:02:11.7131495+02:00; + \ No newline at end of file diff --git a/MP.Mon/Resources/ChangeLog.html b/MP.Mon/Resources/ChangeLog.html index 9cee4eff..e2b87e23 100644 --- a/MP.Mon/Resources/ChangeLog.html +++ b/MP.Mon/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo MON MAPO -

                                      Versione: 6.16.2302.1317

                                      +

                                      Versione: 6.16.2302.1318


                                      Note di rilascio:
                                      • diff --git a/MP.Mon/Resources/VersNum.txt b/MP.Mon/Resources/VersNum.txt index a0e080d2..c212e34f 100644 --- a/MP.Mon/Resources/VersNum.txt +++ b/MP.Mon/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2302.1317 +6.16.2302.1318 diff --git a/MP.Mon/Resources/manifest.xml b/MP.Mon/Resources/manifest.xml index e3b998f3..40b9e8c8 100644 --- a/MP.Mon/Resources/manifest.xml +++ b/MP.Mon/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2302.1317 + 6.16.2302.1318 https://nexus.steamware.net/repository/SWS/MP-MON/stable/LAST/MP.Mon.zip https://nexus.steamware.net/repository/SWS/MP-MON/stable/LAST/ChangeLog.html false From 6e9a32d6a2588c043cda31c39bcbd861f7f8cdc8 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Mon, 13 Feb 2023 18:18:14 +0100 Subject: [PATCH 46/50] test nuova sintassi variabili --- .gitlab-ci.yml | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3286bd51..ab1573d9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -189,7 +189,7 @@ LAND:IIS01:deploy: needs: ["LAND:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj PROG:IIS01:deploy: stage: deploy @@ -206,7 +206,7 @@ PROG:IIS01:deploy: needs: ["PROG:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj STAT:IIS01:deploy: stage: deploy @@ -223,7 +223,7 @@ STAT:IIS01:deploy: needs: ["STAT:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj MON:IIS01:deploy: stage: deploy @@ -240,7 +240,7 @@ MON:IIS01:deploy: needs: ["MON:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj SPEC:IIS01:deploy: stage: deploy @@ -257,7 +257,7 @@ SPEC:IIS01:deploy: needs: ["SPEC:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj INVE:IIS01:deploy: stage: deploy @@ -274,7 +274,7 @@ INVE:IIS01:deploy: needs: ["INVE:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj CONF:IIS01:deploy: stage: deploy @@ -291,7 +291,7 @@ CONF:IIS01:deploy: needs: ["CONF:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj LAND:IIS02:deploy: stage: deploy @@ -308,8 +308,8 @@ LAND:IIS02:deploy: needs: ["LAND:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj PROG:IIS02:deploy: stage: deploy @@ -326,8 +326,8 @@ PROG:IIS02:deploy: needs: ["PROG:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj STAT:IIS02:deploy: stage: deploy @@ -344,8 +344,8 @@ STAT:IIS02:deploy: needs: ["STAT:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj MON:IIS02:deploy: stage: deploy @@ -362,8 +362,8 @@ MON:IIS02:deploy: needs: ["MON:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj SPEC:IIS02:deploy: stage: deploy @@ -380,8 +380,8 @@ SPEC:IIS02:deploy: needs: ["SPEC:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj INVE:IIS02:deploy: stage: deploy @@ -398,8 +398,8 @@ INVE:IIS02:deploy: needs: ["INVE:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj CONF:IIS02:deploy: stage: deploy @@ -416,8 +416,8 @@ CONF:IIS02:deploy: needs: ["CONF:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$NEXUS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj LAND:installer: stage: installer From 54b6cbc18e28125fb1794892e5cd3a4f8733ef56 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Mon, 13 Feb 2023 18:24:12 +0100 Subject: [PATCH 47/50] aggiunto step yaml --- .gitlab-ci.yml | 50 +++++++++++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ab1573d9..6b85c495 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,6 +3,7 @@ variables: PROJ_PATH: '' APP_NAME: 'MP.Stats' SOL_NAME: 'MP-STATS' + IIS_PWD: 'MyPass' # helper x fix pacchetti nuget da repo locale nexus.steamware.net .nuget-fix: &nuget-fix @@ -181,6 +182,7 @@ LAND:IIS01:deploy: variables: APP_NAME: MP.Land SOL_NAME: MP-LAND + IIS_PWD: $IIS_PASSWD before_script: - *nuget-fix - dotnet restore "$env:SOL_NAME.sln" @@ -189,7 +191,7 @@ LAND:IIS01:deploy: needs: ["LAND:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj PROG:IIS01:deploy: stage: deploy @@ -198,6 +200,7 @@ PROG:IIS01:deploy: variables: APP_NAME: MP.Prog SOL_NAME: MP-PROG + IIS_PWD: $IIS_PASSWD before_script: - *nuget-fix - dotnet restore "$env:SOL_NAME.sln" @@ -206,7 +209,7 @@ PROG:IIS01:deploy: needs: ["PROG:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj STAT:IIS01:deploy: stage: deploy @@ -215,6 +218,7 @@ STAT:IIS01:deploy: variables: APP_NAME: MP.Stats SOL_NAME: MP-STATS + IIS_PWD: $IIS_PASSWD before_script: - *nuget-fix - dotnet restore "$env:SOL_NAME.sln" @@ -223,7 +227,7 @@ STAT:IIS01:deploy: needs: ["STAT:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj MON:IIS01:deploy: stage: deploy @@ -232,6 +236,7 @@ MON:IIS01:deploy: variables: APP_NAME: MP.Mon SOL_NAME: MP-MON + IIS_PWD: $IIS_PASSWD before_script: - *nuget-fix - dotnet restore "$env:SOL_NAME.sln" @@ -240,7 +245,7 @@ MON:IIS01:deploy: needs: ["MON:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj SPEC:IIS01:deploy: stage: deploy @@ -249,6 +254,7 @@ SPEC:IIS01:deploy: variables: APP_NAME: MP.SPEC SOL_NAME: MP-SPEC + IIS_PWD: $IIS_PASSWD before_script: - *nuget-fix - dotnet restore "$env:SOL_NAME.sln" @@ -257,7 +263,7 @@ SPEC:IIS01:deploy: needs: ["SPEC:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj INVE:IIS01:deploy: stage: deploy @@ -266,6 +272,7 @@ INVE:IIS01:deploy: variables: APP_NAME: MP.INVE SOL_NAME: MP-INVE + IIS_PWD: $IIS_PASSWD before_script: - *nuget-fix - dotnet restore "$env:SOL_NAME.sln" @@ -274,7 +281,7 @@ INVE:IIS01:deploy: needs: ["INVE:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj CONF:IIS01:deploy: stage: deploy @@ -283,6 +290,7 @@ CONF:IIS01:deploy: variables: APP_NAME: IobConf.UI SOL_NAME: IobConf + IIS_PWD: $IIS_PASSWD before_script: - *nuget-fix - dotnet restore "$env:SOL_NAME.sln" @@ -291,7 +299,7 @@ CONF:IIS01:deploy: needs: ["CONF:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj LAND:IIS02:deploy: stage: deploy @@ -308,8 +316,8 @@ LAND:IIS02:deploy: needs: ["LAND:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj PROG:IIS02:deploy: stage: deploy @@ -326,8 +334,8 @@ PROG:IIS02:deploy: needs: ["PROG:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj STAT:IIS02:deploy: stage: deploy @@ -344,8 +352,8 @@ STAT:IIS02:deploy: needs: ["STAT:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj MON:IIS02:deploy: stage: deploy @@ -362,8 +370,8 @@ MON:IIS02:deploy: needs: ["MON:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj SPEC:IIS02:deploy: stage: deploy @@ -380,8 +388,8 @@ SPEC:IIS02:deploy: needs: ["SPEC:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj INVE:IIS02:deploy: stage: deploy @@ -398,8 +406,8 @@ INVE:IIS02:deploy: needs: ["INVE:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj CONF:IIS02:deploy: stage: deploy @@ -416,8 +424,8 @@ CONF:IIS02:deploy: needs: ["CONF:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj LAND:installer: stage: installer From ee4e159e8f893fe1a844673d8b3c51184c9cdc6c Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Mon, 13 Feb 2023 18:27:05 +0100 Subject: [PATCH 48/50] test yamo alternativo --- .gitlab-ci.yml | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6b85c495..f8cbe1be 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,7 +3,7 @@ variables: PROJ_PATH: '' APP_NAME: 'MP.Stats' SOL_NAME: 'MP-STATS' - IIS_PWD: 'MyPass' + IIS_PWD: 'viaDante16' # helper x fix pacchetti nuget da repo locale nexus.steamware.net .nuget-fix: &nuget-fix @@ -182,7 +182,6 @@ LAND:IIS01:deploy: variables: APP_NAME: MP.Land SOL_NAME: MP-LAND - IIS_PWD: $IIS_PASSWD before_script: - *nuget-fix - dotnet restore "$env:SOL_NAME.sln" @@ -200,7 +199,6 @@ PROG:IIS01:deploy: variables: APP_NAME: MP.Prog SOL_NAME: MP-PROG - IIS_PWD: $IIS_PASSWD before_script: - *nuget-fix - dotnet restore "$env:SOL_NAME.sln" @@ -218,7 +216,6 @@ STAT:IIS01:deploy: variables: APP_NAME: MP.Stats SOL_NAME: MP-STATS - IIS_PWD: $IIS_PASSWD before_script: - *nuget-fix - dotnet restore "$env:SOL_NAME.sln" @@ -236,7 +233,6 @@ MON:IIS01:deploy: variables: APP_NAME: MP.Mon SOL_NAME: MP-MON - IIS_PWD: $IIS_PASSWD before_script: - *nuget-fix - dotnet restore "$env:SOL_NAME.sln" @@ -254,7 +250,6 @@ SPEC:IIS01:deploy: variables: APP_NAME: MP.SPEC SOL_NAME: MP-SPEC - IIS_PWD: $IIS_PASSWD before_script: - *nuget-fix - dotnet restore "$env:SOL_NAME.sln" @@ -272,7 +267,6 @@ INVE:IIS01:deploy: variables: APP_NAME: MP.INVE SOL_NAME: MP-INVE - IIS_PWD: $IIS_PASSWD before_script: - *nuget-fix - dotnet restore "$env:SOL_NAME.sln" @@ -290,7 +284,6 @@ CONF:IIS01:deploy: variables: APP_NAME: IobConf.UI SOL_NAME: IobConf - IIS_PWD: $IIS_PASSWD before_script: - *nuget-fix - dotnet restore "$env:SOL_NAME.sln" From 0da7715ca251f909c1b4b2a8a54eb7cf12a6106e Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Mon, 13 Feb 2023 18:32:30 +0100 Subject: [PATCH 49/50] update test variabili --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f8cbe1be..9ea00aa8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -190,7 +190,8 @@ LAND:IIS01:deploy: needs: ["LAND:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - echo "test var01 $IIS_PASSWD | test var02 $env:IIS_PWD" + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj PROG:IIS01:deploy: stage: deploy From ad4c56eae6f969b57dfab316a5907979c16da8df Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Mon, 13 Feb 2023 19:02:09 +0100 Subject: [PATCH 50/50] refresh yaml e conf var --- .gitlab-ci.yml | 42 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9ea00aa8..ab1573d9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,7 +3,6 @@ variables: PROJ_PATH: '' APP_NAME: 'MP.Stats' SOL_NAME: 'MP-STATS' - IIS_PWD: 'viaDante16' # helper x fix pacchetti nuget da repo locale nexus.steamware.net .nuget-fix: &nuget-fix @@ -190,7 +189,6 @@ LAND:IIS01:deploy: needs: ["LAND:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - echo "test var01 $IIS_PASSWD | test var02 $env:IIS_PWD" - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj PROG:IIS01:deploy: @@ -208,7 +206,7 @@ PROG:IIS01:deploy: needs: ["PROG:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj STAT:IIS01:deploy: stage: deploy @@ -225,7 +223,7 @@ STAT:IIS01:deploy: needs: ["STAT:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj MON:IIS01:deploy: stage: deploy @@ -242,7 +240,7 @@ MON:IIS01:deploy: needs: ["MON:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj SPEC:IIS01:deploy: stage: deploy @@ -259,7 +257,7 @@ SPEC:IIS01:deploy: needs: ["SPEC:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj INVE:IIS01:deploy: stage: deploy @@ -276,7 +274,7 @@ INVE:IIS01:deploy: needs: ["INVE:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj CONF:IIS01:deploy: stage: deploy @@ -293,7 +291,7 @@ CONF:IIS01:deploy: needs: ["CONF:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj LAND:IIS02:deploy: stage: deploy @@ -310,8 +308,8 @@ LAND:IIS02:deploy: needs: ["LAND:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj PROG:IIS02:deploy: stage: deploy @@ -328,8 +326,8 @@ PROG:IIS02:deploy: needs: ["PROG:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj STAT:IIS02:deploy: stage: deploy @@ -346,8 +344,8 @@ STAT:IIS02:deploy: needs: ["STAT:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj MON:IIS02:deploy: stage: deploy @@ -364,8 +362,8 @@ MON:IIS02:deploy: needs: ["MON:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj SPEC:IIS02:deploy: stage: deploy @@ -382,8 +380,8 @@ SPEC:IIS02:deploy: needs: ["SPEC:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj INVE:IIS02:deploy: stage: deploy @@ -400,8 +398,8 @@ INVE:IIS02:deploy: needs: ["INVE:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj CONF:IIS02:deploy: stage: deploy @@ -418,8 +416,8 @@ CONF:IIS02:deploy: needs: ["CONF:build"] script: - dotnet build $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj - - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$env:IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS02.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj + - dotnet publish -p:PublishProfile=IIS03.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PASSWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj LAND:installer: stage: installer