worker-machine-shift:后端完整改造 - Controller添加ShiftStart/ShiftEnd字段, Repository SQL修复GROUP BY和worker_id直连

main
haoliang 1 month ago
parent 740bd16349
commit 55a2a5a9fe

@ -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<WorkerProductionSummaryResponse>(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); }

@ -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<WorkerRankResponse>(sql, new { StartDate = startDate, EndDate = endDate, Top = top }).ToList();
var rows = conn.Query<WorkerRankResponse>(sql, new { Start = startDate, End = endDate, Top = top }).ToList();
// 填充排名
for (int i = 0; i < rows.Count; i++) rows[i].Rank = i + 1;
return rows;

@ -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<MachineDetailResponse>(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 + @"";

@ -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<object>.Success(null));
}
@ -126,9 +126,9 @@ namespace CncWebApi.Controllers
/// </summary>
[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<object>.Success(null));
}
@ -184,9 +184,15 @@ namespace CncWebApi.Controllers
/// <summary>
/// 绑定/解绑机床请求
/// </summary>
public class UnbindMachineRequest { public int BindingId { get; set; } }
public class BindMachineRequest
{
/// <summary>机床ID</summary>
public int MachineId { get; set; }
/// <summary>班次开始时间</summary>
public string ShiftStart { get; set; }
/// <summary>班次结束时间</summary>
public string ShiftEnd { get; set; }
}
}

Loading…
Cancel
Save