From a781dfabb8707097f67519ffccd237af314af4db Mon Sep 17 00:00:00 2001
From: haoliang <821644@qq.com>
Date: Wed, 13 May 2026 12:10:10 +0800
Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BB=AA=E8=A1=A8=E7=9B=98AP?=
=?UTF-8?q?I=E7=AB=AF=E7=82=B9=EF=BC=9ANC=E7=A8=8B=E5=BA=8F=E4=BA=A7?=
=?UTF-8?q?=E9=87=8F=E6=8E=92=E8=A1=8CTOP10=E5=92=8CNC=E7=A8=8B=E5=BA=8F?=
=?UTF-8?q?=E4=BA=A7=E9=87=8F=E5=88=86=E5=B8=83=EF=BC=88=E9=A5=BC=E5=9B=BE?=
=?UTF-8?q?=E6=95=B0=E6=8D=AE=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Impl/Dashboard/DashboardRepository.cs | 46 +++++++++++++++++++
.../Interface/IDashboardRepository.cs | 6 +++
src/CncService/Impl/DashboardService.cs | 16 +++++++
src/CncService/Interface/IDashboardService.cs | 6 +++
.../Controllers/DashboardController.cs | 24 ++++++++++
5 files changed, 98 insertions(+)
diff --git a/src/CncRepository/Impl/Dashboard/DashboardRepository.cs b/src/CncRepository/Impl/Dashboard/DashboardRepository.cs
index abee519..14df000 100644
--- a/src/CncRepository/Impl/Dashboard/DashboardRepository.cs
+++ b/src/CncRepository/Impl/Dashboard/DashboardRepository.cs
@@ -249,6 +249,52 @@ namespace CncRepository.Impl.Dashboard
}
}
+ /// NC程序产量排行
+ public List GetProgramRank(DateTime startDate, DateTime endDate, int top, string sortOrder = "desc")
+ {
+ var orderBy = string.Equals(sortOrder, "asc", StringComparison.OrdinalIgnoreCase) ? "ASC" : "DESC";
+ using (var conn = CreateConnection())
+ {
+ var sql = $@"
+ SELECT seg.program_name AS ProgramName,
+ SUM(CASE WHEN seg.is_settled=1 THEN seg.quantity
+ ELSE COALESCE(seg.end_part_count, seg.start_part_count) - seg.start_part_count END) AS TotalQuantity,
+ COUNT(DISTINCT seg.machine_id) AS MachineCount
+ FROM cnc_production_segment seg
+ WHERE seg.production_date BETWEEN @StartDate AND @EndDate
+ GROUP BY seg.program_name
+ ORDER BY TotalQuantity {orderBy}
+ LIMIT @Top";
+ var rows = conn.Query(sql, new { StartDate = startDate, EndDate = endDate, Top = top }).ToList();
+ for (int i = 0; i < rows.Count; i++) rows[i].Rank = i + 1;
+ return rows;
+ }
+ }
+
+ /// NC程序产量分布
+ public List GetProgramDistribution(DateTime startDate, DateTime endDate, int top = 10)
+ {
+ using (var conn = CreateConnection())
+ {
+ var sql = @"
+ SELECT seg.program_name AS ProgramName,
+ SUM(CASE WHEN seg.is_settled=1 THEN seg.quantity
+ ELSE COALESCE(seg.end_part_count, seg.start_part_count) - seg.start_part_count END) AS TotalQuantity
+ FROM cnc_production_segment seg
+ WHERE seg.production_date BETWEEN @StartDate AND @EndDate
+ GROUP BY seg.program_name
+ ORDER BY TotalQuantity DESC
+ LIMIT @Top";
+ var rows = conn.Query(sql, new { StartDate = startDate, EndDate = endDate, Top = top }).ToList();
+ var total = rows.Sum(r => r.TotalQuantity);
+ if (total > 0)
+ {
+ foreach (var r in rows) r.Percentage = Math.Round((decimal)r.TotalQuantity / total * 100, 2);
+ }
+ return rows;
+ }
+ }
+
/// 最近告警
public List GetRecentAlerts(int count)
{
diff --git a/src/CncRepository/Interface/IDashboardRepository.cs b/src/CncRepository/Interface/IDashboardRepository.cs
index 5e1c8c1..d4105ef 100644
--- a/src/CncRepository/Interface/IDashboardRepository.cs
+++ b/src/CncRepository/Interface/IDashboardRepository.cs
@@ -22,5 +22,11 @@ namespace CncRepository.Interface
object GetMachineStatusDistribution();
List GetRecentAlerts(int count);
+
+ /// NC程序产量排行TOP N
+ List GetProgramRank(DateTime startDate, DateTime endDate, int top, string sortOrder = "desc");
+
+ /// NC程序产量分布(饼图数据)
+ List GetProgramDistribution(DateTime startDate, DateTime endDate, int top = 10);
}
}
diff --git a/src/CncService/Impl/DashboardService.cs b/src/CncService/Impl/DashboardService.cs
index cab35c4..27f954e 100644
--- a/src/CncService/Impl/DashboardService.cs
+++ b/src/CncService/Impl/DashboardService.cs
@@ -69,6 +69,22 @@ namespace CncService.Impl
return _dashboardRepository.GetMachineStatusDistribution();
}
+ ///
+ public List GetProgramRank(DateTime? startDate, DateTime? endDate, int top = 10, string sortOrder = "desc")
+ {
+ var s = startDate ?? DateTime.Today;
+ var e = endDate ?? DateTime.Today;
+ return _dashboardRepository.GetProgramRank(s, e, top, sortOrder);
+ }
+
+ ///
+ public List GetProgramDistribution(DateTime? startDate, DateTime? endDate, int top = 10)
+ {
+ var s = startDate ?? DateTime.Today;
+ var e = endDate ?? DateTime.Today;
+ return _dashboardRepository.GetProgramDistribution(s, e, top);
+ }
+
///
public List GetRecentAlerts(int count = 5)
{
diff --git a/src/CncService/Interface/IDashboardService.cs b/src/CncService/Interface/IDashboardService.cs
index 06f0eb7..3886406 100644
--- a/src/CncService/Interface/IDashboardService.cs
+++ b/src/CncService/Interface/IDashboardService.cs
@@ -24,5 +24,11 @@ namespace CncService.Interface
List GetRecentAlerts(int count = 5);
object GetCollectorStatus();
+
+ /// NC程序产量排行TOP N
+ List GetProgramRank(DateTime? startDate, DateTime? endDate, int top = 10, string sortOrder = "desc");
+
+ /// NC程序产量分布(饼图数据)
+ List GetProgramDistribution(DateTime? startDate, DateTime? endDate, int top = 10);
}
}
diff --git a/src/CncWebApi/Controllers/DashboardController.cs b/src/CncWebApi/Controllers/DashboardController.cs
index d885a3a..d0e2468 100644
--- a/src/CncWebApi/Controllers/DashboardController.cs
+++ b/src/CncWebApi/Controllers/DashboardController.cs
@@ -116,6 +116,30 @@ namespace CncWebApi.Controllers
return Ok(ApiResponse