From d07747368afdf467594294d71b006756ba5217ff Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 12 Mar 2025 07:27:17 +0100 Subject: [PATCH] Update selezione filtro tipo flusso in Trend --- MP.Data/Controllers/MpStatsController.cs | 22 +- MP.Mon/Components/DetailMSE.razor | 8 +- MP.Mon/Pages/Index.razor | 2 +- MP.Mon/wwwroot/css/site.css | 12 +- MP.Mon/wwwroot/css/site.less | 12 +- MP.Mon/wwwroot/css/site.min.css | 2 +- MP.Stats/Components/ChartTrends.razor | 73 ++--- MP.Stats/Components/ChartTrends.razor.cs | 323 ++++++++++++----------- MP.Stats/Data/MpStatsService.cs | 39 ++- MP.Stats/MP.Stats.csproj | 4 +- MP.Stats/Pages/Index.razor | 1 + MP.Stats/Pages/TrendAnalysis.razor | 2 +- MP.Stats/Pages/TrendAnalysis.razor.cs | 17 +- MP.Stats/Resources/ChangeLog.html | 2 +- MP.Stats/Resources/VersNum.txt | 2 +- MP.Stats/Resources/manifest.xml | 2 +- 16 files changed, 312 insertions(+), 211 deletions(-) diff --git a/MP.Data/Controllers/MpStatsController.cs b/MP.Data/Controllers/MpStatsController.cs index 5f1e228a..67b1064d 100644 --- a/MP.Data/Controllers/MpStatsController.cs +++ b/MP.Data/Controllers/MpStatsController.cs @@ -296,13 +296,33 @@ namespace MP.Data.Controllers .DbSetFL .Where(x => (IdxMacchina == "*" || x.IdxMacchina == IdxMacchina) - && (fluxType == "" || x.FluxType == fluxType) + && (fluxType == "*" || x.FluxType == fluxType) && (x.dtEvento >= DtStart && x.dtEvento <= DtEnd)) .ToList(); } return dbResult; } + /// + /// Elenco di tipi flusso disponibili + /// + /// + public List FluxTypeList() + { + List dbResult = new List(); + using (var dbCtx = new MoonPro_STATSContext(_configuration)) + { + + dbResult = dbCtx + .DbSetFL + .Select(x => x.FluxType) + .Distinct() + .OrderBy(x => x) + .ToList(); + } + return dbResult; + } + /// /// Elenco tabella ODL da filtro /// diff --git a/MP.Mon/Components/DetailMSE.razor b/MP.Mon/Components/DetailMSE.razor index bc653ef3..2a30e66f 100644 --- a/MP.Mon/Components/DetailMSE.razor +++ b/MP.Mon/Components/DetailMSE.razor @@ -90,10 +90,10 @@ } else { -
-
TC.
-
std @getMinSec(@CurrRecord.TCAssegnato)
-
act @getMinSec(@CurrRecord.TCLavRT)
+
+
TC. Act
+ @*
std @getMinSec(@CurrRecord.TCAssegnato)
*@ +
@getMinSec(@CurrRecord.TCLavRT) [@getMinSec(@CurrRecord.TCAssegnato)]
} @if (hasRow(5)) diff --git a/MP.Mon/Pages/Index.razor b/MP.Mon/Pages/Index.razor index 75638978..e71c77c6 100644 --- a/MP.Mon/Pages/Index.razor +++ b/MP.Mon/Pages/Index.razor @@ -41,7 +41,7 @@ else } else { -
 
+
 
} }
diff --git a/MP.Mon/wwwroot/css/site.css b/MP.Mon/wwwroot/css/site.css index bf3c7f30..544a1293 100644 --- a/MP.Mon/wwwroot/css/site.css +++ b/MP.Mon/wwwroot/css/site.css @@ -176,37 +176,37 @@ a, @media all and (min-width: 320px) { .statusMap .ui-title, .statusMap .ui-li-aside { - font-size: 1.6em; + font-size: 1.5em; } } @media all and (min-width: 800px) { .statusMap .ui-title, .statusMap .ui-li-aside { - font-size: 1.7em; + font-size: 1.6em; } } @media all and (min-width: 1024px) { .statusMap .ui-title, .statusMap .ui-li-aside { - font-size: 1.8em; + font-size: 1.7em; } } @media all and (min-width: 1440px) { .statusMap .ui-title, .statusMap .ui-li-aside { - font-size: 1.9em; + font-size: 1.8em; } } @media all and (min-width: 1980px) { .statusMap .ui-title, .statusMap .ui-li-aside { - font-size: 2em; + font-size: 1.9em; } } @media all and (min-width: 3960px) { .statusMap .ui-title, .statusMap .ui-li-aside { - font-size: 2.1em; + font-size: 2em; } } /* END: gestione layout dinamico mappa... */ diff --git a/MP.Mon/wwwroot/css/site.less b/MP.Mon/wwwroot/css/site.less index e667e451..dd80af18 100644 --- a/MP.Mon/wwwroot/css/site.less +++ b/MP.Mon/wwwroot/css/site.less @@ -186,37 +186,37 @@ a, .btn-link { @media all and (min-width: 320px) { .statusMap .ui-title, .statusMap .ui-li-aside { - font-size: 1.6em; + font-size: 1.5em; } } @media all and (min-width: 800px) { .statusMap .ui-title, .statusMap .ui-li-aside { - font-size: 1.7em; + font-size: 1.6em; } } @media all and (min-width: 1024px) { .statusMap .ui-title, .statusMap .ui-li-aside { - font-size: 1.8em; + font-size: 1.7em; } } @media all and (min-width: 1440px) { .statusMap .ui-title, .statusMap .ui-li-aside { - font-size: 1.9em; + font-size: 1.8em; } } @media all and (min-width: 1980px) { .statusMap .ui-title, .statusMap .ui-li-aside { - font-size: 2.0em; + font-size: 1.9em; } } @media all and (min-width: 3960px) { .statusMap .ui-title, .statusMap .ui-li-aside { - font-size: 2.1em; + font-size: 2.0em; } } diff --git a/MP.Mon/wwwroot/css/site.min.css b/MP.Mon/wwwroot/css/site.min.css index 219bdbfe..ae0b0e0e 100644 --- a/MP.Mon/wwwroot/css/site.min.css +++ b/MP.Mon/wwwroot/css/site.min.css @@ -1 +1 @@ -@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');@import url('fonts.min.css');h1,h2,h3,h4,h5,h6,b,display-1,display-2,display-3,display-4{font-family:'Lato',sans-serif;}html,body{height:100%;}html,body{font-family:'Roboto Condensed',sans-serif;line-height:1.25;background-image:linear-gradient(180deg,#010816 20%,#3aa6ff 90%);background-size:auto 100%;background-repeat:no-repeat;}h1:focus{outline:0;}a,.btn-link{color:#0071c1;}.btn-primary{color:#fff;background-color:#1b6ec2;border-color:#1861ac;}.content{padding-top:1.1rem;}.valid.modified:not([type=checkbox]){outline:1px solid #26b050;}.invalid{outline:1px solid #f00;}.validation-message{color:#f00;}.regionnotclicked{fill:white;}.regionclicked{fill:red;}.striked{text-decoration:line-through;}.textTrim{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.maxChar{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.max5Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:5rem;}.max10Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:10rem;}.max20Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:20rem;}.max30Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:30rem;}.max40Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:40rem;}.max50Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:50rem;}.max100Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:100rem;}.footer{line-height:1.8em;}#blazor-error-ui{background:#ffffe0;bottom:0;box-shadow:0 -1px 2px rgba(0,0,0,.2);display:none;left:0;padding:.6rem 1.25rem .7rem 1.25rem;position:fixed;width:100%;z-index:1000;}#blazor-error-ui .dismiss{cursor:pointer;position:absolute;right:.75rem;top:.5rem;}.blazor-error-boundary{background:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem,#b32121;padding:1rem 1rem 1rem 3.7rem;color:#fff;}.blazor-error-boundary::after{content:"An error has occurred.";}.fontSmall{font-size:.75em;}.fontSmaller{font-size:.6em;}.statusMap .ui-title,.statusMap .ui-li-aside{text-transform:uppercase;font-size:1.5em;line-height:1.1em;color:#dedede;text-shadow:2px 2px 4px #000;text-align:center;background:linear-gradient(270deg,rgba(20,20,20,.7),rgba(100,100,100,.7),rgba(20,20,20,.7));}.statusMap .ui-subtitle{line-height:1.1em;color:#dedede;text-shadow:2px 2px 4px #000;text-align:center;background:linear-gradient(270deg,rgba(0,0,0,.4),rgba(100,100,100,.4),rgba(0,0,0,.4));}.statusMap .ui-footer{color:#cdcdcd;background:linear-gradient(270deg,rgba(10,10,10,.7),rgba(80,80,80,.7),rgba(10,10,10,.7));}.machBlock{padding:0 2px 0 2px;}@media all and (min-width:320px){.statusMap .ui-title,.statusMap .ui-li-aside{font-size:1.6em;}}@media all and (min-width:800px){.statusMap .ui-title,.statusMap .ui-li-aside{font-size:1.7em;}}@media all and (min-width:1024px){.statusMap .ui-title,.statusMap .ui-li-aside{font-size:1.8em;}}@media all and (min-width:1440px){.statusMap .ui-title,.statusMap .ui-li-aside{font-size:1.9em;}}@media all and (min-width:1980px){.statusMap .ui-title,.statusMap .ui-li-aside{font-size:2em;}}@media all and (min-width:3960px){.statusMap .ui-title,.statusMap .ui-li-aside{font-size:2.1em;}}.semBlinkVe,.semFixVe,.semFixVe_b,.semVe,.semVe_b{background:#009036;background:rgba(0,255,80,.6);color:#ffa;}.semBlinkGr,.semFixGr,.semFixGr_b,.semGr,.semGr_b{background-color:#bcbcbc;background:rgba(180,180,180,.6);}.semGi{text-align:left;background:#8a8d27;background:rgba(230,210,0,.6);padding:0 4px 0 4px;color:#000;}.semGi_b,.semFixGi,.semFixGi_b{text-align:left;background:#f9ff18;background:rgba(255,255,0,.8);padding:0 4px 0 4px;color:#333;}.semBl{text-align:left;background:#000e7a;background:rgba(0,5,200,.6);padding:0 4px 0 4px;color:#959500;}.semBl_b,.semFixBl,.semFixBl_b{text-align:left;background:#243fff;background:rgba(60,80,255,.8);padding:0 4px 0 4px;color:#ffff32;}.semRo{text-align:left;background-color:#7a000e;background:rgba(200,0,5,.6);padding:0 4px 0 4px;color:#959500;}.semRo_b,.semFixRo,.semFixRo_b{text-align:left;background-color:#ff243f;background:rgba(255,60,80,.8);padding:0 4px 0 4px;color:#ffff32;}.no-cpu{-moz-transform:translateZ(0);-o-transform:translateZ(0);-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0);}@-webkit-keyframes blinkBack{0%{background-position:0% 50%;}50%{background-position:100% 50%;}100%{background-position:0% 50%;}}@-moz-keyframes blinkBack{0%{background-position:0% 50%;}50%{background-position:100% 50%;}100%{background-position:0% 50%;}}@-o-keyframes blinkBack{0%{background-position:0% 50%;}50%{background-position:100% 50%;}100%{background-position:0% 50%;}}@keyframes blinkBack{0%{background-position:0% 50%;}50%{background-position:100% 50%;}100%{background-position:0% 50%;}}.semBlinkGi{background:linear-gradient(270deg,#8a8d27,#f9ff18);background-size:400% 400%;-webkit-animation:blinkBack 2s ease infinite;-moz-animation:blinkBack 2s ease infinite;-o-animation:blinkBack 2s ease infinite;animation:blinkBack 2s ease infinite;}.semBlinkRo{background:linear-gradient(270deg,#7a000e,#ff243f);background-size:400% 400%;-webkit-animation:blinkBack 2s ease infinite;-moz-animation:blinkBack 2s ease infinite;-o-animation:blinkBack 2s ease infinite;animation:blinkBack 2s ease infinite;color:#ff0;}.mainHead,.logoImg{height:1.6em;}@media all and (min-width:425px){.mainHead{font-size:1.3em;}body{font-size:.8em;}.logoImg{height:30px;}}@media all and (min-width:768px){.mainHead{font-size:1.4em;}body{font-size:1em;}.logoImg{height:35px;}}@media all and (min-width:800px){body{font-size:.6em;}}@media all and (min-width:1024px){body{font-size:.7em;}}@media all and (min-width:1280px){body{font-size:.8em;}}@media all and (min-width:1440px){body{font-size:1em;}}@media all and (min-width:1680px){body{font-size:1.1em;}}@media all and (min-width:1920px){body{font-size:1.3em;}}@media all and (min-width:2560px){body{font-size:3em;}}@media all and (max-width:425px){body{font-size:.7em;}} \ No newline at end of file +@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');@import url('fonts.min.css');h1,h2,h3,h4,h5,h6,b,display-1,display-2,display-3,display-4{font-family:'Lato',sans-serif;}html,body{height:100%;}html,body{font-family:'Roboto Condensed',sans-serif;line-height:1.25;background-image:linear-gradient(180deg,#010816 20%,#3aa6ff 90%);background-size:auto 100%;background-repeat:no-repeat;}h1:focus{outline:0;}a,.btn-link{color:#0071c1;}.btn-primary{color:#fff;background-color:#1b6ec2;border-color:#1861ac;}.content{padding-top:1.1rem;}.valid.modified:not([type=checkbox]){outline:1px solid #26b050;}.invalid{outline:1px solid #f00;}.validation-message{color:#f00;}.regionnotclicked{fill:white;}.regionclicked{fill:red;}.striked{text-decoration:line-through;}.textTrim{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.maxChar{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.max5Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:5rem;}.max10Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:10rem;}.max20Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:20rem;}.max30Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:30rem;}.max40Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:40rem;}.max50Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:50rem;}.max100Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:100rem;}.footer{line-height:1.8em;}#blazor-error-ui{background:#ffffe0;bottom:0;box-shadow:0 -1px 2px rgba(0,0,0,.2);display:none;left:0;padding:.6rem 1.25rem .7rem 1.25rem;position:fixed;width:100%;z-index:1000;}#blazor-error-ui .dismiss{cursor:pointer;position:absolute;right:.75rem;top:.5rem;}.blazor-error-boundary{background:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem,#b32121;padding:1rem 1rem 1rem 3.7rem;color:#fff;}.blazor-error-boundary::after{content:"An error has occurred.";}.fontSmall{font-size:.75em;}.fontSmaller{font-size:.6em;}.statusMap .ui-title,.statusMap .ui-li-aside{text-transform:uppercase;font-size:1.5em;line-height:1.1em;color:#dedede;text-shadow:2px 2px 4px #000;text-align:center;background:linear-gradient(270deg,rgba(20,20,20,.7),rgba(100,100,100,.7),rgba(20,20,20,.7));}.statusMap .ui-subtitle{line-height:1.1em;color:#dedede;text-shadow:2px 2px 4px #000;text-align:center;background:linear-gradient(270deg,rgba(0,0,0,.4),rgba(100,100,100,.4),rgba(0,0,0,.4));}.statusMap .ui-footer{color:#cdcdcd;background:linear-gradient(270deg,rgba(10,10,10,.7),rgba(80,80,80,.7),rgba(10,10,10,.7));}.machBlock{padding:0 2px 0 2px;}@media all and (min-width:320px){.statusMap .ui-title,.statusMap .ui-li-aside{font-size:1.5em;}}@media all and (min-width:800px){.statusMap .ui-title,.statusMap .ui-li-aside{font-size:1.6em;}}@media all and (min-width:1024px){.statusMap .ui-title,.statusMap .ui-li-aside{font-size:1.7em;}}@media all and (min-width:1440px){.statusMap .ui-title,.statusMap .ui-li-aside{font-size:1.8em;}}@media all and (min-width:1980px){.statusMap .ui-title,.statusMap .ui-li-aside{font-size:1.9em;}}@media all and (min-width:3960px){.statusMap .ui-title,.statusMap .ui-li-aside{font-size:2em;}}.semBlinkVe,.semFixVe,.semFixVe_b,.semVe,.semVe_b{background:#009036;background:rgba(0,255,80,.6);color:#ffa;}.semBlinkGr,.semFixGr,.semFixGr_b,.semGr,.semGr_b{background-color:#bcbcbc;background:rgba(180,180,180,.6);}.semGi{text-align:left;background:#8a8d27;background:rgba(230,210,0,.6);padding:0 4px 0 4px;color:#000;}.semGi_b,.semFixGi,.semFixGi_b{text-align:left;background:#f9ff18;background:rgba(255,255,0,.8);padding:0 4px 0 4px;color:#333;}.semBl{text-align:left;background:#000e7a;background:rgba(0,5,200,.6);padding:0 4px 0 4px;color:#959500;}.semBl_b,.semFixBl,.semFixBl_b{text-align:left;background:#243fff;background:rgba(60,80,255,.8);padding:0 4px 0 4px;color:#ffff32;}.semRo{text-align:left;background-color:#7a000e;background:rgba(200,0,5,.6);padding:0 4px 0 4px;color:#959500;}.semRo_b,.semFixRo,.semFixRo_b{text-align:left;background-color:#ff243f;background:rgba(255,60,80,.8);padding:0 4px 0 4px;color:#ffff32;}.no-cpu{-moz-transform:translateZ(0);-o-transform:translateZ(0);-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0);}@-webkit-keyframes blinkBack{0%{background-position:0% 50%;}50%{background-position:100% 50%;}100%{background-position:0% 50%;}}@-moz-keyframes blinkBack{0%{background-position:0% 50%;}50%{background-position:100% 50%;}100%{background-position:0% 50%;}}@-o-keyframes blinkBack{0%{background-position:0% 50%;}50%{background-position:100% 50%;}100%{background-position:0% 50%;}}@keyframes blinkBack{0%{background-position:0% 50%;}50%{background-position:100% 50%;}100%{background-position:0% 50%;}}.semBlinkGi{background:linear-gradient(270deg,#8a8d27,#f9ff18);background-size:400% 400%;-webkit-animation:blinkBack 2s ease infinite;-moz-animation:blinkBack 2s ease infinite;-o-animation:blinkBack 2s ease infinite;animation:blinkBack 2s ease infinite;}.semBlinkRo{background:linear-gradient(270deg,#7a000e,#ff243f);background-size:400% 400%;-webkit-animation:blinkBack 2s ease infinite;-moz-animation:blinkBack 2s ease infinite;-o-animation:blinkBack 2s ease infinite;animation:blinkBack 2s ease infinite;color:#ff0;}.mainHead,.logoImg{height:1.6em;}@media all and (min-width:425px){.mainHead{font-size:1.3em;}body{font-size:.8em;}.logoImg{height:30px;}}@media all and (min-width:768px){.mainHead{font-size:1.4em;}body{font-size:1em;}.logoImg{height:35px;}}@media all and (min-width:800px){body{font-size:.6em;}}@media all and (min-width:1024px){body{font-size:.7em;}}@media all and (min-width:1280px){body{font-size:.8em;}}@media all and (min-width:1440px){body{font-size:1em;}}@media all and (min-width:1680px){body{font-size:1.1em;}}@media all and (min-width:1920px){body{font-size:1.3em;}}@media all and (min-width:2560px){body{font-size:3em;}}@media all and (max-width:425px){body{font-size:.7em;}} \ No newline at end of file diff --git a/MP.Stats/Components/ChartTrends.razor b/MP.Stats/Components/ChartTrends.razor index bb47f23a..ed2a3360 100644 --- a/MP.Stats/Components/ChartTrends.razor +++ b/MP.Stats/Components/ChartTrends.razor @@ -1,21 +1,22 @@ @using ChartJs
- @if (RawData == null || RawData.Count == 0) - { -
-
No Chart Data
-
- } - else - { -
-
-
+
+
+
+
+ + +
+
+
    -
  • - Sel.Dettaglio -
  • @foreach (PeriodoSel sPer in Enum.GetValues(typeof(PeriodoSel))) {
  • @@ -25,26 +26,30 @@
-
-
-
-
    - @foreach (var item in @ParetoData) - { -
  • - @item.label - @item.value -
  • - } -
- selezione ITEM da mostrare, tra quelli POSSIBILI dato periodo... -
-
+
+
    + @foreach (var item in @ParetoData) + { +
  • + @item.label + @item.value +
  • + } +
+ selezione ITEM da mostrare, tra quelli POSSIBILI dato periodo... +
+
+
+ @if (RawData == null || RawData.Count == 0) + { +
+
No Chart Data
+
+ } + else + {
- @*
- -
*@
@pSel Detail @@ -56,8 +61,8 @@
-
- } + } +
diff --git a/MP.Stats/Components/ChartTrends.razor.cs b/MP.Stats/Components/ChartTrends.razor.cs index db2bfb6f..099ee6c4 100644 --- a/MP.Stats/Components/ChartTrends.razor.cs +++ b/MP.Stats/Components/ChartTrends.razor.cs @@ -16,6 +16,12 @@ namespace MP.Stats.Components { #region Public Properties + [Parameter] + public List CodFluxList { get; set; } + + [Parameter] + public EventCallback EC_CodFluxSel { get; set; } + [Parameter] public List RawData { @@ -34,9 +40,17 @@ namespace MP.Stats.Components #endregion Public Properties - #region Protected Fields + #region Protected Enums - #endregion Protected Fields + protected enum PeriodoSel + { + Day, + Week, + Month, + Year + } + + #endregion Protected Enums #region Protected Properties @@ -50,8 +64,22 @@ namespace MP.Stats.Components { get => semaphColors(ParetoData.Count, "0.3"); } + protected List bgColorsDet { get; set; } = new List(); + protected string CodFluxSel + { + get => codFluxSel; + set + { + if (codFluxSel != value) + { + codFluxSel = value; + EC_CodFluxSel.InvokeAsync(value).ConfigureAwait(false); + } + } + } + /// /// Genera colori sfondo 33% rosso / arancione / giallo /// @@ -69,6 +97,7 @@ namespace MP.Stats.Components { get => semaphColors(ParetoData.Count, "1"); } + protected List lineColorsDet { get; set; } = new List(); [Inject] @@ -84,7 +113,34 @@ namespace MP.Stats.Components #region Protected Methods - + /// + /// Genera colori sfondo alternat full / quasi grigi (x preious data) + /// + /// numero record CURRENT + /// + /// + protected List cpColors(int numRecords, string alpha) + { + List answ = new List(); + int r = 0; + int g = 0; + int b = 0; + // ciclo x numRecords-1 + for (int j = 0; j < numRecords; j++) + { + r = 54 + (180 - 54) * j / numRecords; + g = 86 + (35 - 86) * j / numRecords; + b = 254 + (180 - 254) * j / numRecords; + answ.Add($"rgba({r}, {g}, {b}, {alpha}"); + answ.Add($"rgba({(510 + r) / 3},{(510 + g) / 3},{(510 + b) / 3}, {alpha}"); + } + // chiude + while (answ.Count < numRecords) + { + answ.Add($"rgba(180, 180, 35, {alpha})"); + } + return answ; + } /// /// Genera colori sfondo 33% rosso / arancione / giallo @@ -127,12 +183,20 @@ namespace MP.Stats.Components private List lineTitles = new List() { "Consumo/UM" }; private List lineTitlesDet = new List() { "Consumo/UM" }; + private List listMachine = new List(); private string pieTitle = "Macchina"; + /// + /// Modalità selezione + /// + private PeriodoSel pSel; + #endregion Private Fields #region Private Properties + private string codFluxSel { get; set; } + private List DatiPareto { get => ParetoData.Select(x => x.value).ToList(); @@ -152,6 +216,7 @@ namespace MP.Stats.Components { get => TSData.Select(r => $"{r.x:yyyy-MM-dd}").ToList(); } + private List LabelPlotDet { get; set; } = new List(); private int numMachine @@ -162,17 +227,119 @@ namespace MP.Stats.Components private List ParetoData { get; set; } = new List(); private List TSData { get; set; } = new List(); private List> TSDataMulti { get; set; } = new List>(); + /// /// TimeSeries su scala DAY /// private List> TSDataMultiDetail { get; set; } = new List>(); - private List listMachine = new List(); - #endregion Private Properties #region Private Methods + private double cDouble(string origValue) + { + double dblVal = 0; + double.TryParse(origValue, NumberStyles.Any, CultureInfo.InvariantCulture, out dblVal); + return dblVal; + } + + private string CssBtn(PeriodoSel reqMode) + { + string answ = "btn-outline-primary"; + if (reqMode == pSel) + { + answ = "btn-primary text-light"; + } + return answ; + } + + private DateTime GetFirstDayOfWeek(DateTime date) + { + int offset = date.DayOfWeek - DayOfWeek.Sunday; + return date.AddDays(-offset); + } + + /// + /// Ritorna dettaglio dato macchina e tipo (current o prev) + /// + /// Macchina richiesta + /// Flusso richiesto + /// Modo recap (se null --> intero periodo) + /// Indica se iin caso di recap sia periodo corrente/precedente + /// + private List GetTSDetail(string idxMacc, string codFlux, PeriodoSel? recapMode, bool isCurrent = true) + { + List answ = new(); + if (!recapMode.HasValue) + { + answ = RawData + .Where(x => x.IdxMacchina == idxMacc) + .Select(r => new chartJsData.chartJsTSerie() { x = r.dtEvento, y = cDouble(r.Valore) }) + .OrderBy(o => o.x) + .ToList(); + } + else + { + // fake fix: indietro 7 gg... + DateTime dataRif = DateTime.Today;//.AddDays(-7); + TimeSpan deltaOld = new TimeSpan(0); + DateTime dtStart = dataRif; + DateTime inizio = dataRif; + DateTime fine = inizio.AddDays(1); + double startVal = 0; + switch (recapMode) + { + case PeriodoSel.Day: + inizio = isCurrent ? dataRif : dataRif.AddDays(-1); + fine = inizio.AddDays(1); + deltaOld = TimeSpan.FromDays(1); + break; + + case PeriodoSel.Week: + inizio = isCurrent ? GetFirstDayOfWeek(dataRif) : GetFirstDayOfWeek(dataRif).AddDays(-7); + fine = inizio.AddDays(7); + deltaOld = TimeSpan.FromDays(7); + break; + + case PeriodoSel.Month: + inizio = isCurrent ? new DateTime(dataRif.Year, dataRif.Month, 1) : new DateTime(dataRif.Year, dataRif.Month, 1).AddMonths(-1); + fine = inizio.AddMonths(1); + deltaOld = inizio.AddMonths(1).Subtract(inizio); + break; + + case PeriodoSel.Year: + inizio = isCurrent ? new DateTime(dataRif.Year, 1, 1) : new DateTime(dataRif.Year, 1, 1).AddYears(-1); + fine = inizio.AddYears(1); + deltaOld = inizio.AddYears(1).Subtract(inizio); + break; + + case null: + default: + break; + } + // calcolo il minimo... + var listRaw = RawData + .Where(x => x.IdxMacchina == idxMacc && x.dtEvento >= inizio && x.dtEvento < fine) + .OrderBy(o => o.dtEvento) + .ToList(); + var firstRec = listRaw + .FirstOrDefault(); + if (firstRec != null) + { + startVal = cDouble(firstRec.Valore); + dtStart = firstRec.dtEvento.Date; + } + + answ = listRaw + .Select(r => new chartJsData.chartJsTSerie() { x = isCurrent ? r.dtEvento : r.dtEvento.Add(deltaOld), y = cDouble(r.Valore) - startVal }) + .OrderBy(o => o.x) + .ToList(); + } + + return answ; + } + private void RecalcData() { if (RawData != null) @@ -234,7 +401,7 @@ namespace MP.Stats.Components // LabelPlotDet = currPlot.Select(r => $"{r.x:yyyy-MM-dd}").ToList(); // break; } - } + } #endif } @@ -243,140 +410,6 @@ namespace MP.Stats.Components } } - private DateTime GetFirstDayOfWeek(DateTime date) - { - int offset = date.DayOfWeek - DayOfWeek.Sunday; - return date.AddDays(-offset); - } - - - /// - /// Genera colori sfondo alternat full / quasi grigi (x preious data) - /// - /// numero record CURRENT - /// - /// - protected List cpColors(int numRecords, string alpha) - { - List answ = new List(); - int r = 0; - int g = 0; - int b = 0; - // ciclo x numRecords-1 - for (int j = 0; j < numRecords; j++) - { - r = 54 + (180 - 54) * j / numRecords; - g = 86 + (35 - 86) * j / numRecords; - b = 254 + (180 - 254) * j / numRecords; - answ.Add($"rgba({r}, {g}, {b}, {alpha}"); - answ.Add($"rgba({(510 + r) / 3},{(510 + g) / 3},{(510 + b) / 3}, {alpha}"); - } - // chiude - while (answ.Count < numRecords) - { - answ.Add($"rgba(180, 180, 35, {alpha})"); - } - return answ; - } - - /// - /// Ritorna dettaglio dato macchina e tipo (current o prev) - /// - /// Macchina richiesta - /// Flusso richiesto - /// Modo recap (se null --> intero periodo) - /// Indica se iin caso di recap sia periodo corrente/precedente - /// - private List GetTSDetail(string idxMacc, string codFlux, PeriodoSel? recapMode, bool isCurrent = true) - { - List answ = new(); - if (!recapMode.HasValue) - { - answ = RawData - .Where(x => x.IdxMacchina == idxMacc) - .Select(r => new chartJsData.chartJsTSerie() { x = r.dtEvento, y = cDouble(r.Valore) }) - .OrderBy(o => o.x) - .ToList(); - } - else - { - // fake fix: indietro 7 gg... - DateTime dataRif = DateTime.Today;//.AddDays(-7); - TimeSpan deltaOld = new TimeSpan(0); - DateTime dtStart = dataRif; - DateTime inizio = dataRif; - DateTime fine = inizio.AddDays(1); - double startVal = 0; - switch (recapMode) - { - case PeriodoSel.Day: - inizio = isCurrent ? dataRif : dataRif.AddDays(-1); - fine = inizio.AddDays(1); - deltaOld = TimeSpan.FromDays(1); - break; - case PeriodoSel.Week: - inizio = isCurrent ? GetFirstDayOfWeek(dataRif) : GetFirstDayOfWeek(dataRif).AddDays(-7); - fine = inizio.AddDays(7); - deltaOld = TimeSpan.FromDays(7); - break; - case PeriodoSel.Month: - inizio = isCurrent ? new DateTime(dataRif.Year, dataRif.Month, 1) : new DateTime(dataRif.Year, dataRif.Month, 1).AddMonths(-1); - fine = inizio.AddMonths(1); - deltaOld = inizio.AddMonths(1).Subtract(inizio); - break; - case PeriodoSel.Year: - inizio = isCurrent ? new DateTime(dataRif.Year, 1, 1) : new DateTime(dataRif.Year, 1, 1).AddYears(-1); - fine = inizio.AddYears(1); - deltaOld = inizio.AddYears(1).Subtract(inizio); - break; - - - case null: - default: - break; - } - // calcolo il minimo... - var listRaw = RawData - .Where(x => x.IdxMacchina == idxMacc && x.dtEvento >= inizio && x.dtEvento < fine) - .OrderBy(o => o.dtEvento) - .ToList(); - var firstRec = listRaw - .FirstOrDefault(); - if (firstRec != null) - { - startVal = cDouble(firstRec.Valore); - dtStart = firstRec.dtEvento.Date; - } - - answ = listRaw - .Select(r => new chartJsData.chartJsTSerie() { x = isCurrent ? r.dtEvento : r.dtEvento.Add(deltaOld), y = cDouble(r.Valore) - startVal }) - .OrderBy(o => o.x) - .ToList(); - } - - return answ; - } - - private double cDouble(string origValue) - { - double dblVal = 0; - double.TryParse(origValue, NumberStyles.Any, CultureInfo.InvariantCulture, out dblVal); - return dblVal; - } - - /// - /// Modalità selezione - /// - private PeriodoSel pSel; - - protected enum PeriodoSel - { - Day, - Week, - Month, - Year - } - private void SetModo(PeriodoSel newModo) { pSel = newModo; @@ -384,16 +417,6 @@ namespace MP.Stats.Components RecalcData(); } - private string CssBtn(PeriodoSel reqMode) - { - string answ = "btn-outline-primary"; - if (reqMode == pSel) - { - answ = "btn-primary text-light"; - } - return answ; - } - #endregion Private Methods } } \ No newline at end of file diff --git a/MP.Stats/Data/MpStatsService.cs b/MP.Stats/Data/MpStatsService.cs index b48aa24d..2d4bd3fd 100644 --- a/MP.Stats/Data/MpStatsService.cs +++ b/MP.Stats/Data/MpStatsService.cs @@ -457,7 +457,7 @@ namespace MP.Stats.Data List result = new List(); // cerco in redis... DateTime adesso = DateTime.Now; - string currKey = getCacheKey($"{redisBaseKey}:FL_DATA", CurrFilter); + string currKey = getCacheKey($"{redisBaseKey}:FL_DATA:FT_{fluxType}", CurrFilter); RedisValue rawData = await redisDb.StringGetAsync(currKey); if (rawData.HasValue) { @@ -480,6 +480,43 @@ namespace MP.Stats.Data return result; } + /// + /// Elenco di tipi flusso disponibili + /// + /// + public async Task> FluxTypeList() + { + // setup parametri costanti + string source = "DB"; + Stopwatch sw = new Stopwatch(); + sw.Start(); + List result = new List(); + // cerco in redis... + DateTime adesso = DateTime.Now; + string currKey = $"{redisBaseKey}:FTList"; + RedisValue rawData = await redisDb.StringGetAsync(currKey); + if (rawData.HasValue) + { + result = JsonConvert.DeserializeObject>($"{rawData}"); + source = "REDIS"; + } + else + { + result = dbController.FluxTypeList(); + // serializzp e salvo... + rawData = JsonConvert.SerializeObject(result); + await redisDb.StringSetAsync(currKey, rawData, UltraLongCache); + } + if (result == null) + { + result = new List(); + } + sw.Stop(); + Log.Debug($"FluxTypeList | {source} | {sw.Elapsed.TotalMilliseconds}ms"); + return result; + } + + /// /// Statistiche ODL /// diff --git a/MP.Stats/MP.Stats.csproj b/MP.Stats/MP.Stats.csproj index 229f3d81..eaa0030e 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.2503.1118 - 6.16.2503.1118 + 6.16.2503.1207 + 6.16.2503.1207 true $(NoWarn);1591 en diff --git a/MP.Stats/Pages/Index.razor b/MP.Stats/Pages/Index.razor index 7292bc7c..23c0d727 100644 --- a/MP.Stats/Pages/Index.razor +++ b/MP.Stats/Pages/Index.razor @@ -35,6 +35,7 @@
+ diff --git a/MP.Stats/Pages/TrendAnalysis.razor b/MP.Stats/Pages/TrendAnalysis.razor index b838a479..2c01db0b 100644 --- a/MP.Stats/Pages/TrendAnalysis.razor +++ b/MP.Stats/Pages/TrendAnalysis.razor @@ -8,7 +8,7 @@
- +