diff --git a/src/CncRepository/Impl/Dashboard/DashboardRepository.cs b/src/CncRepository/Impl/Dashboard/DashboardRepository.cs index 14df000..2cd4dad 100644 --- a/src/CncRepository/Impl/Dashboard/DashboardRepository.cs +++ b/src/CncRepository/Impl/Dashboard/DashboardRepository.cs @@ -17,31 +17,7 @@ namespace CncRepository.Impl.Dashboard { public DashboardRepository(string connectionString) : base(connectionString) { } - /// - /// 通用产量计算SQL片段:已汇总日期用cnc_daily_production,未汇总日期用cnc_production_segment实时计算。 - /// 与machine表JOIN时,需在外层提供 machine_id 列。 - /// 参数:@StartDate, @EndDate - /// 返回列:machine_id, production_date, day_quantity - /// - private const string DailyQuantityUnionSql = @" - SELECT machine_id, production_date, day_quantity FROM ( - SELECT dp.machine_id, dp.production_date, SUM(dp.total_quantity) AS day_quantity - FROM cnc_daily_production dp - WHERE dp.production_date BETWEEN @StartDate AND @EndDate - GROUP BY dp.machine_id, dp.production_date - ) summarized - UNION ALL - SELECT seg.machine_id, seg.production_date, - 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 day_quantity - FROM cnc_production_segment seg - WHERE seg.production_date BETWEEN @StartDate AND @EndDate - AND NOT EXISTS ( - SELECT 1 FROM cnc_daily_production dp - WHERE dp.machine_id = seg.machine_id AND dp.production_date = seg.production_date - ) - GROUP BY seg.machine_id, seg.production_date - ) all_days"; + // 产量查询现已统一使用 cnc_daily_production 表,不再需要 cnc_production_segment UNION /// 汇总卡片数据 public DashboardSummaryResponse GetSummary() @@ -50,11 +26,10 @@ namespace CncRepository.Impl.Dashboard { var onlineCount = conn.ExecuteScalar(@"SELECT COUNT(1) FROM cnc_machine WHERE is_enabled = 1 AND last_ping_time IS NOT NULL AND last_ping_time >= NOW() - INTERVAL 20 SECOND"); var totalMachines = conn.ExecuteScalar(@"SELECT COUNT(1) FROM cnc_machine WHERE is_enabled = 1"); - // 今日总产量:直接从产量分段实时计算(今日一定没有日终汇总) + // 今日总产量:从 cnc_daily_production 汇总 var todayProduction = conn.ExecuteScalar(@" - SELECT COALESCE(SUM(CASE WHEN is_settled=1 THEN quantity - ELSE COALESCE(end_part_count,start_part_count) - start_part_count END), 0) - FROM cnc_production_segment WHERE production_date = CURDATE()"); + SELECT COALESCE(SUM(end_total_count - base_total_count), 0) + FROM cnc_daily_production WHERE production_date = CURDATE()"); var activeAlerts = conn.ExecuteScalar(@"SELECT COUNT(1) FROM cnc_alert WHERE is_resolved = 0"); // 采集成功率:基于原始采集日志的成功/失败比率 @@ -96,23 +71,11 @@ namespace CncRepository.Impl.Dashboard FROM cnc_workshop w LEFT JOIN cnc_machine m ON m.workshop_id = w.id AND m.is_enabled = 1 LEFT JOIN ( - SELECT machine_id, production_date, day_quantity FROM ( - SELECT dp.machine_id, dp.production_date, SUM(dp.total_quantity) AS day_quantity - FROM cnc_daily_production dp - WHERE dp.production_date BETWEEN @StartDate AND @EndDate - GROUP BY dp.machine_id, dp.production_date - ) summarized - UNION ALL - SELECT seg.machine_id, seg.production_date, - 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 day_quantity - FROM cnc_production_segment seg - WHERE seg.production_date BETWEEN @StartDate AND @EndDate - AND NOT EXISTS ( - SELECT 1 FROM cnc_daily_production dp - WHERE dp.machine_id = seg.machine_id AND dp.production_date = seg.production_date - ) - GROUP BY seg.machine_id, seg.production_date + 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 = m.id GROUP BY w.id, w.name"; return conn.Query(sql, new { StartDate = startDate, EndDate = endDate }).ToList(); @@ -131,28 +94,16 @@ namespace CncRepository.Impl.Dashboard m.name AS MachineName, COALESCE(SUM(ad.day_quantity), 0) AS Quantity, (CASE WHEN m.last_ping_time IS NOT NULL AND m.last_ping_time >= NOW() - INTERVAL 20 SECOND THEN 1 ELSE 0 END) AS Status, - (SELECT seg.program_name FROM cnc_production_segment seg - WHERE seg.machine_id = m.id AND seg.production_date = CURDATE() - ORDER BY seg.id DESC LIMIT 1) AS Program + (SELECT program_name FROM cnc_daily_production + WHERE machine_id = m.id AND production_date = CURDATE() + ORDER BY id DESC LIMIT 1) AS Program FROM cnc_machine m LEFT JOIN ( - SELECT machine_id, production_date, day_quantity FROM ( - SELECT dp.machine_id, dp.production_date, SUM(dp.total_quantity) AS day_quantity - FROM cnc_daily_production dp - WHERE dp.production_date BETWEEN @StartDate AND @EndDate - GROUP BY dp.machine_id, dp.production_date - ) summarized - UNION ALL - SELECT seg.machine_id, seg.production_date, - 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 day_quantity - FROM cnc_production_segment seg - WHERE seg.production_date BETWEEN @StartDate AND @EndDate - AND NOT EXISTS ( - SELECT 1 FROM cnc_daily_production dp - WHERE dp.machine_id = seg.machine_id AND dp.production_date = seg.production_date - ) - GROUP BY seg.machine_id, seg.production_date + 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 = m.id GROUP BY m.id, m.name, m.is_enabled, m.last_ping_time ORDER BY Quantity {orderBy} @@ -178,23 +129,11 @@ namespace CncRepository.Impl.Dashboard FROM cnc_worker w LEFT JOIN cnc_worker_machine wm ON wm.worker_id = w.id LEFT JOIN ( - SELECT machine_id, production_date, day_quantity FROM ( - SELECT dp.machine_id, dp.production_date, SUM(dp.total_quantity) AS day_quantity - FROM cnc_daily_production dp - WHERE dp.production_date BETWEEN @StartDate AND @EndDate - GROUP BY dp.machine_id, dp.production_date - ) summarized - UNION ALL - SELECT seg.machine_id, seg.production_date, - 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 day_quantity - FROM cnc_production_segment seg - WHERE seg.production_date BETWEEN @StartDate AND @EndDate - AND NOT EXISTS ( - SELECT 1 FROM cnc_daily_production dp - WHERE dp.machine_id = seg.machine_id AND dp.production_date = seg.production_date - ) - GROUP BY seg.machine_id, seg.production_date + 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 GROUP BY w.id, w.name ORDER BY TotalQuantity {orderBy} @@ -211,26 +150,12 @@ namespace CncRepository.Impl.Dashboard { using (var conn = CreateConnection()) { - // 已汇总日期用daily_production,未汇总日期用segment实时计算 + // 从 cnc_daily_production 汇总产量趋势 var sql = @" - SELECT production_date AS Date, COALESCE(SUM(day_quantity), 0) AS Quantity - FROM ( - SELECT dp.production_date, SUM(dp.total_quantity) AS day_quantity - FROM cnc_daily_production dp - WHERE dp.production_date >= DATE_SUB(CURDATE(), INTERVAL @Days DAY) - GROUP BY dp.production_date - UNION ALL - SELECT seg.production_date, - 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 day_quantity - FROM cnc_production_segment seg - WHERE seg.production_date >= DATE_SUB(CURDATE(), INTERVAL @Days DAY) - AND NOT EXISTS ( - SELECT 1 FROM cnc_daily_production dp - WHERE dp.production_date = seg.production_date - ) - GROUP BY seg.production_date - ) all_days + SELECT production_date AS Date, + COALESCE(SUM(end_total_count - base_total_count), 0) AS Quantity + FROM cnc_daily_production + WHERE production_date >= DATE_SUB(CURDATE(), INTERVAL @Days DAY) GROUP BY production_date ORDER BY production_date ASC"; return conn.Query(sql, new { Days = days }).ToList(); @@ -256,13 +181,12 @@ namespace CncRepository.Impl.Dashboard 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 + SELECT program_name AS ProgramName, + SUM(end_total_count - base_total_count) AS TotalQuantity, + COUNT(DISTINCT machine_id) AS MachineCount + FROM cnc_daily_production + WHERE production_date BETWEEN @StartDate AND @EndDate + GROUP BY program_name ORDER BY TotalQuantity {orderBy} LIMIT @Top"; var rows = conn.Query(sql, new { StartDate = startDate, EndDate = endDate, Top = top }).ToList(); @@ -277,12 +201,11 @@ namespace CncRepository.Impl.Dashboard 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 + SELECT program_name AS ProgramName, + SUM(end_total_count - base_total_count) AS TotalQuantity + FROM cnc_daily_production + WHERE production_date BETWEEN @StartDate AND @EndDate + GROUP BY program_name ORDER BY TotalQuantity DESC LIMIT @Top"; var rows = conn.Query(sql, new { StartDate = startDate, EndDate = endDate, Top = top }).ToList();