From 55a2a5a9fe2d51b9adfb06aa28baf77c4c195350 Mon Sep 17 00:00:00 2001 From: haoliang <821644@qq.com> Date: Sun, 17 May 2026 03:13:36 +0800 Subject: [PATCH] =?UTF-8?q?worker-machine-shift:=E5=90=8E=E7=AB=AF?= =?UTF-8?q?=E5=AE=8C=E6=95=B4=E6=94=B9=E9=80=A0=20-=20Controller=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0ShiftStart/ShiftEnd=E5=AD=97=E6=AE=B5,=20Repository=20?= =?UTF-8?q?SQL=E4=BF=AE=E5=A4=8DGROUP=20BY=E5=92=8Cworker=5Fid=E7=9B=B4?= =?UTF-8?q?=E8=BF=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Impl/DailyProductionRepository.cs | 4 ++-- .../Impl/Dashboard/DashboardRepository.cs | 15 ++++++--------- src/CncRepository/Impl/MachineRepository.cs | 8 +++++--- src/CncWebApi/Controllers/WorkerController.cs | 12 +++++++++--- 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/CncRepository/Impl/DailyProductionRepository.cs b/src/CncRepository/Impl/DailyProductionRepository.cs index 929c316..b9a7ede 100644 --- a/src/CncRepository/Impl/DailyProductionRepository.cs +++ b/src/CncRepository/Impl/DailyProductionRepository.cs @@ -163,7 +163,7 @@ namespace CncRepository.Impl { using (var conn = CreateConnection()) { - string sql = @"SELECT COALESCE(SUM(dp.end_total_count - dp.base_total_count), 0) AS TotalQuantity, COUNT(DISTINCT w.id) AS ActiveWorkerCount FROM cnc_daily_production dp JOIN cnc_worker_machine wm ON dp.machine_id = wm.machine_id JOIN cnc_worker w ON wm.worker_id = w.id WHERE dp.production_date BETWEEN @Start AND @End AND dp.end_total_count > dp.base_total_count"; + string sql = @"SELECT COALESCE(SUM(dp.end_total_count - dp.base_total_count), 0) AS TotalQuantity, COUNT(DISTINCT dp.worker_id) AS ActiveWorkerCount FROM cnc_daily_production dp WHERE dp.production_date BETWEEN @Start AND @End AND dp.end_total_count > dp.base_total_count AND dp.worker_id IS NOT NULL"; var result = conn.QuerySingleOrDefault(sql, new { Start = startDate, End = endDate }); if (result == null) return new WorkerProductionSummaryResponse(); if (result.ActiveWorkerCount > 0) result.AvgPerWorker = Math.Round((decimal)result.TotalQuantity / result.ActiveWorkerCount, 1); @@ -177,7 +177,7 @@ namespace CncRepository.Impl { using (var conn = CreateConnection()) { - string sql = @"SELECT w.name AS WorkerName, COUNT(DISTINCT wm.machine_id) AS MachineCount, COUNT(DISTINCT dp.program_name) AS ProgramCount, COALESCE(SUM(dp.end_total_count - dp.base_total_count), 0) AS TotalQuantity, GROUP_CONCAT(DISTINCT wm.machine_id) AS MachineIds, GROUP_CONCAT(DISTINCT dp.program_name) AS ProgramNames FROM cnc_worker w JOIN cnc_worker_machine wm ON wm.worker_id = w.id LEFT JOIN cnc_daily_production dp ON dp.machine_id = wm.machine_id AND dp.production_date BETWEEN @Start AND @End AND dp.end_total_count > dp.base_total_count"; + string sql = @"SELECT w.name AS WorkerName, COUNT(DISTINCT dp.machine_id) AS MachineCount, COUNT(DISTINCT dp.program_name) AS ProgramCount, COALESCE(SUM(dp.end_total_count - dp.base_total_count), 0) AS TotalQuantity FROM cnc_daily_production dp JOIN cnc_worker w ON dp.worker_id = w.id WHERE dp.production_date BETWEEN @Start AND @End AND dp.end_total_count > dp.base_total_count"; var parameters = new DynamicParameters(); parameters.Add("Start", startDate); parameters.Add("End", endDate); if (workerId.HasValue) { sql += " AND w.id = @WorkerId"; parameters.Add("WorkerId", workerId.Value); } diff --git a/src/CncRepository/Impl/Dashboard/DashboardRepository.cs b/src/CncRepository/Impl/Dashboard/DashboardRepository.cs index 74b28eb..7da676e 100644 --- a/src/CncRepository/Impl/Dashboard/DashboardRepository.cs +++ b/src/CncRepository/Impl/Dashboard/DashboardRepository.cs @@ -126,20 +126,17 @@ namespace CncRepository.Impl.Dashboard var sql = $@" SELECT w.name AS WorkerName, COUNT(DISTINCT wm.machine_id) AS MachineCount, - COALESCE(SUM(ad.day_quantity), 0) AS TotalQuantity + COALESCE(SUM(dp.end_total_count - dp.base_total_count), 0) AS TotalQuantity FROM cnc_worker w LEFT JOIN cnc_worker_machine wm ON wm.worker_id = w.id - LEFT JOIN ( - SELECT machine_id, production_date, - SUM(end_total_count - base_total_count) AS day_quantity - FROM cnc_daily_production - WHERE production_date BETWEEN @StartDate AND @EndDate - GROUP BY machine_id, production_date - ) ad ON ad.machine_id = wm.machine_id + LEFT JOIN cnc_daily_production dp ON dp.worker_id = w.id + AND dp.production_date BETWEEN @Start AND @End + AND dp.end_total_count > dp.base_total_count GROUP BY w.id, w.name + HAVING SUM(dp.end_total_count - dp.base_total_count) > 0 ORDER BY TotalQuantity {orderBy} LIMIT @Top"; - var rows = conn.Query(sql, new { StartDate = startDate, EndDate = endDate, Top = top }).ToList(); + var rows = conn.Query(sql, new { Start = startDate, End = endDate, Top = top }).ToList(); // 填充排名 for (int i = 0; i < rows.Count; i++) rows[i].Rank = i + 1; return rows; diff --git a/src/CncRepository/Impl/MachineRepository.cs b/src/CncRepository/Impl/MachineRepository.cs index 04314de..1c60480 100644 --- a/src/CncRepository/Impl/MachineRepository.cs +++ b/src/CncRepository/Impl/MachineRepository.cs @@ -44,13 +44,14 @@ namespace CncRepository.Impl m.is_enabled as IsEnabled, (CASE WHEN m.last_ping_time IS NOT NULL AND m.last_ping_time >= NOW() - INTERVAL 20 SECOND THEN 1 ELSE 0 END) as IsOnline, m.last_ping_latency as LastPingLatency, - w.id as WorkerId, w.name as WorkerName, + w.id as WorkerId, GROUP_CONCAT(w.name SEPARATOR ', ') as WorkerNames, m.last_program_name as LastProgramName, m.last_collect_time as LastCollectTime FROM cnc_machine m LEFT JOIN cnc_workshop ws ON m.workshop_id = ws.id LEFT JOIN cnc_brand b ON m.brand_id = b.id LEFT JOIN cnc_worker_machine wm ON m.id = wm.machine_id LEFT JOIN cnc_worker w ON wm.worker_id = w.id + GROUP BY m.id, m.name, m.device_code, m.workshop_id, ws.name, m.collect_address_id, m.brand_id, b.brand_name, m.ip_address, m.is_enabled, m.last_ping_latency, m.last_program_name, m.last_collect_time WHERE m.id = @Id"; return conn.QuerySingleOrDefault(sql, new { Id = id }); } @@ -89,12 +90,13 @@ namespace CncRepository.Impl var sql = @"SELECT m.id as Id, m.device_code as DeviceCode, m.name as Name, m.workshop_id as WorkshopId, ws.name as WorkshopName, m.collect_address_id as CollectAddressId, m.brand_id as BrandId, b.brand_name as BrandName, m.ip_address as IpAddress, m.is_enabled as IsEnabled, (CASE WHEN m.last_ping_time IS NOT NULL AND m.last_ping_time >= NOW() - INTERVAL 20 SECOND THEN 1 ELSE 0 END) as IsOnline, m.last_ping_latency as LastPingLatency, - m.last_program_name as LastProgramName, m.last_collect_time as LastCollectTime, w.id as WorkerId, w.name as WorkerName + m.last_program_name as LastProgramName, m.last_collect_time as LastCollectTime, w.id as WorkerId, GROUP_CONCAT(w.name SEPARATOR ', ') as WorkerNames FROM cnc_machine m LEFT JOIN cnc_workshop ws ON m.workshop_id = ws.id LEFT JOIN cnc_brand b ON m.brand_id = b.id LEFT JOIN cnc_worker_machine wm ON m.id = wm.machine_id - LEFT JOIN cnc_worker w ON wm.worker_id = w.id" + where + @" ORDER BY m.id DESC LIMIT @Limit OFFSET @Offset"; + LEFT JOIN cnc_worker w ON wm.worker_id = w.id + GROUP BY m.id, m.device_code, m.name, m.workshop_id, ws.name, m.collect_address_id, m.brand_id, b.brand_name, m.ip_address, m.is_enabled, m.last_ping_latency, m.last_program_name, m.last_collect_time" + where + @" ORDER BY m.id DESC LIMIT @Limit OFFSET @Offset"; p.Add("Limit", limit); p.Add("Offset", offset); var totalSql = @"SELECT COUNT(*) FROM cnc_machine m" + where + @""; diff --git a/src/CncWebApi/Controllers/WorkerController.cs b/src/CncWebApi/Controllers/WorkerController.cs index e2bdcb0..181af8b 100644 --- a/src/CncWebApi/Controllers/WorkerController.cs +++ b/src/CncWebApi/Controllers/WorkerController.cs @@ -116,7 +116,7 @@ namespace CncWebApi.Controllers [Route("{id:int}/bind")] public IHttpActionResult BindMachine(int id, [FromBody] BindMachineRequest request) { - var result = _workerService.BindMachine(id, request.MachineId); + var result = _workerService.BindMachine(id, request.MachineId, request.ShiftStart, request.ShiftEnd); return Ok(ApiResponse.Success(null)); } @@ -126,9 +126,9 @@ namespace CncWebApi.Controllers /// [HttpPost] [Route("{id:int}/unbind")] - public IHttpActionResult UnbindMachine(int id, [FromBody] BindMachineRequest request) + public IHttpActionResult UnbindMachine(int id, [FromBody] UnbindMachineRequest request) { - var result = _workerService.UnbindMachine(id, request.MachineId); + var result = _workerService.UnbindMachine(request.BindingId); return Ok(ApiResponse.Success(null)); } @@ -184,9 +184,15 @@ namespace CncWebApi.Controllers /// /// 绑定/解绑机床请求 /// + public class UnbindMachineRequest { public int BindingId { get; set; } } + public class BindMachineRequest { /// 机床ID public int MachineId { get; set; } + /// 班次开始时间 + public string ShiftStart { get; set; } + /// 班次结束时间 + public string ShiftEnd { get; set; } } }