fix(web): load overview stock summary with scalar projection
Build CutList image / build-and-push (push) Successful in 19s
Build CutList image / build-and-push (push) Successful in 19s
This commit is contained in:
@@ -33,17 +33,18 @@ public class OverviewService
|
|||||||
|
|
||||||
var frequentStock = await context.JobStocks
|
var frequentStock = await context.JobStocks
|
||||||
.AsNoTracking()
|
.AsNoTracking()
|
||||||
.GroupBy(s => new { s.MaterialId, s.LengthInches })
|
.GroupBy(s => new { s.MaterialId, s.LengthInches, s.Material.Shape, s.Material.Size })
|
||||||
.Select(g => new
|
.Select(g => new
|
||||||
{
|
{
|
||||||
g.Key.MaterialId,
|
g.Key.MaterialId,
|
||||||
g.Key.LengthInches,
|
g.Key.LengthInches,
|
||||||
JobCount = g.Select(s => s.JobId).Distinct().Count(),
|
g.Key.Shape,
|
||||||
Material = g.Select(s => s.Material).First()
|
g.Key.Size,
|
||||||
|
JobCount = g.Select(s => s.JobId).Distinct().Count()
|
||||||
})
|
})
|
||||||
.OrderByDescending(s => s.JobCount)
|
.OrderByDescending(s => s.JobCount)
|
||||||
.ThenBy(s => s.Material.Shape)
|
.ThenBy(s => s.Shape)
|
||||||
.ThenBy(s => s.Material.Size)
|
.ThenBy(s => s.Size)
|
||||||
.ThenBy(s => s.LengthInches)
|
.ThenBy(s => s.LengthInches)
|
||||||
.Take(5)
|
.Take(5)
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
@@ -61,7 +62,7 @@ public class OverviewService
|
|||||||
recentJobs,
|
recentJobs,
|
||||||
frequentStock.Select(s => new FrequentStockOverview(
|
frequentStock.Select(s => new FrequentStockOverview(
|
||||||
s.MaterialId,
|
s.MaterialId,
|
||||||
s.Material.DisplayName,
|
$"{s.Shape.GetDisplayName()} - {s.Size}",
|
||||||
s.LengthInches,
|
s.LengthInches,
|
||||||
s.JobCount)).ToList());
|
s.JobCount)).ToList());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ class OverviewDashboardTests(unittest.TestCase):
|
|||||||
self.assertIn("context.Jobs", source)
|
self.assertIn("context.Jobs", source)
|
||||||
self.assertIn("context.JobStocks", source)
|
self.assertIn("context.JobStocks", source)
|
||||||
self.assertIn("OrderByDescending(j => j.CreatedAt)", source)
|
self.assertIn("OrderByDescending(j => j.CreatedAt)", source)
|
||||||
self.assertIn("GroupBy(s => new { s.MaterialId, s.LengthInches })", source)
|
self.assertIn("GroupBy(s => new { s.MaterialId, s.LengthInches, s.Material.Shape, s.Material.Size })", source)
|
||||||
|
|
||||||
def test_overview_renders_recent_jobs_and_frequently_specified_stock(self) -> None:
|
def test_overview_renders_recent_jobs_and_frequently_specified_stock(self) -> None:
|
||||||
markup = HOME_PAGE.read_text()
|
markup = HOME_PAGE.read_text()
|
||||||
@@ -31,6 +31,14 @@ class OverviewDashboardTests(unittest.TestCase):
|
|||||||
self.assertIn("overview.RecentJobs", markup)
|
self.assertIn("overview.RecentJobs", markup)
|
||||||
self.assertIn("overview.FrequentStock", markup)
|
self.assertIn("overview.FrequentStock", markup)
|
||||||
|
|
||||||
|
def test_overview_groups_stock_by_scalar_material_fields(self) -> None:
|
||||||
|
source = OVERVIEW_SERVICE.read_text()
|
||||||
|
self.assertIn(
|
||||||
|
"GroupBy(s => new { s.MaterialId, s.LengthInches, s.Material.Shape, s.Material.Size })",
|
||||||
|
source,
|
||||||
|
)
|
||||||
|
self.assertNotIn("Material = g.Select(s => s.Material).First()", source)
|
||||||
|
|
||||||
def test_overview_service_is_registered_and_has_dashboard_layout_rules(self) -> None:
|
def test_overview_service_is_registered_and_has_dashboard_layout_rules(self) -> None:
|
||||||
self.assertIn("AddScoped<OverviewService>()", PROGRAM.read_text())
|
self.assertIn("AddScoped<OverviewService>()", PROGRAM.read_text())
|
||||||
css = APP_CSS.read_text()
|
css = APP_CSS.read_text()
|
||||||
|
|||||||
Reference in New Issue
Block a user