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.Success(new { items = result })); } + /// + /// NC程序产量排行TOP N + /// GET /api/admin/dashboard/program-rank + /// + [HttpGet] + [Route("program-rank")] + public IHttpActionResult GetProgramRank(DateTime? startDate = null, DateTime? endDate = null, int top = 10, string sortOrder = "desc") + { + var result = _dashboardService.GetProgramRank(startDate, endDate, top, sortOrder); + return Ok(ApiResponse.Success(new { items = result })); + } + + /// + /// NC程序产量分布(饼图数据) + /// GET /api/admin/dashboard/program-distribution + /// + [HttpGet] + [Route("program-distribution")] + public IHttpActionResult GetProgramDistribution(DateTime? startDate = null, DateTime? endDate = null, int top = 10) + { + var result = _dashboardService.GetProgramDistribution(startDate, endDate, top); + return Ok(ApiResponse.Success(new { items = result })); + } + /// /// 采集服务状态 /// GET /api/admin/collector/status