diff --git a/frontend/src/views/production/ProductionPage.vue b/frontend/src/views/production/ProductionPage.vue index 53c6424..df5f452 100644 --- a/frontend/src/views/production/ProductionPage.vue +++ b/frontend/src/views/production/ProductionPage.vue @@ -173,13 +173,11 @@ function resetFilters() { loadData() } -// 初始化:加载筛选项与数据,设置默认日期范围(近7天) +// 初始化:加载筛选项与数据,设置默认日期为今天 async function init() { - // 默认近7天日期 - const end = new Date() - const start = new Date() - start.setDate(end.getDate() - 6) - filters.dateRange = [start.toISOString().split('T')[0], end.toISOString().split('T')[0]] + // 默认今天 + const today = new Date().toISOString().split('T')[0] + filters.dateRange = [today, today] // 加载筛选项 try { const [ws, mc, wr] = await Promise.all([ diff --git a/src/CncRepository/Impl/Dashboard/DashboardRepository.cs b/src/CncRepository/Impl/Dashboard/DashboardRepository.cs index 8cf6143..b82a8f4 100644 --- a/src/CncRepository/Impl/Dashboard/DashboardRepository.cs +++ b/src/CncRepository/Impl/Dashboard/DashboardRepository.cs @@ -24,7 +24,11 @@ namespace CncRepository.Impl.Dashboard { var onlineCount = conn.ExecuteScalar(@"SELECT COUNT(1) FROM cnc_machine WHERE is_online = 1"); var totalMachines = conn.ExecuteScalar(@"SELECT COUNT(1) FROM cnc_machine"); - var todayProduction = conn.ExecuteScalar(@"SELECT COALESCE(SUM(total_quantity),0) FROM cnc_daily_production WHERE production_date = CURDATE()"); + // 今日总产量:直接从产量分段实时计算 + 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()"); var activeAlerts = conn.ExecuteScalar(@"SELECT COUNT(1) FROM cnc_alert WHERE is_resolved = 0"); // 采集成功率:基于原始采集日志的成功/失败比率 @@ -33,7 +37,15 @@ namespace CncRepository.Impl.Dashboard var totalCount = successCount + failCount; decimal collectSuccessRate = totalCount > 0 ? Math.Round((decimal)successCount / totalCount * 100, 2) : 0m; - var todayCuttingTime = conn.ExecuteScalar(@"SELECT COALESCE(SUM(total_cutting_time),0) FROM cnc_daily_production WHERE production_date = CURDATE()"); + // 今日切削总时:每台机床今日最新cutting_time - 今日最早cutting_time,求和后转小时 + var todayCuttingTime = Convert.ToInt32(conn.ExecuteScalar(@" + SELECT COALESCE(ROUND(SUM(today_delta)/3600, 1), 0) + FROM ( + SELECT MAX(cr.cutting_time) - MIN(cr.cutting_time) AS today_delta + FROM cnc_collect_record cr + WHERE DATE(cr.collect_time) = CURDATE() + GROUP BY cr.machine_id + ) t")); var runningMachines = conn.ExecuteScalar(@"SELECT COUNT(1) FROM cnc_machine WHERE last_device_status = 'running'"); var dataMissingMachines = conn.ExecuteScalar(@"SELECT COUNT(1) FROM cnc_machine_daily_status WHERE production_date = CURDATE() AND data_status = 'data_missing'"); @@ -56,17 +68,25 @@ namespace CncRepository.Impl.Dashboard { using (var conn = CreateConnection()) { + // 当查询范围包含今天时,使用产量分段实时数据;历史日期使用日终汇总 + var today = DateTime.Today; + bool includeToday = endDate >= today; + DateTime histEnd = includeToday ? today.AddDays(-1) : endDate; + var sql = @" SELECT w.Name AS WorkshopName, - COALESCE(SUM(dp.total_quantity),0) AS Quantity, + COALESCE(SUM(CASE WHEN is_settled=1 THEN dp.quantity + ELSE COALESCE(dp.end_part_count,dp.start_part_count) - dp.start_part_count END), 0) AS Quantity, COUNT(DISTINCT m.id) AS MachineCount, CASE - WHEN DATEDIFF(@EndDate, @StartDate) = 0 THEN COALESCE(SUM(dp.total_quantity),0) / NULLIF(COUNT(DISTINCT m.id),0) - ELSE COALESCE(SUM(dp.total_quantity),0) / (DATEDIFF(@EndDate, @StartDate) + 1) / NULLIF(COUNT(DISTINCT m.id),0) + WHEN DATEDIFF(@EndDate, @StartDate) = 0 THEN COALESCE(SUM(CASE WHEN is_settled=1 THEN dp.quantity + ELSE COALESCE(dp.end_part_count,dp.start_part_count) - dp.start_part_count END), 0) / NULLIF(COUNT(DISTINCT m.id),0) + ELSE COALESCE(SUM(CASE WHEN is_settled=1 THEN dp.quantity + ELSE COALESCE(dp.end_part_count,dp.start_part_count) - dp.start_part_count END), 0) / (DATEDIFF(@EndDate, @StartDate) + 1) / NULLIF(COUNT(DISTINCT m.id),0) END AS AvgQuantity FROM cnc_workshop w LEFT JOIN cnc_machine m ON m.workshop_id = w.id - LEFT JOIN cnc_daily_production dp ON dp.machine_id = m.id + LEFT JOIN cnc_production_segment dp ON dp.machine_id = m.id AND dp.production_date BETWEEN @StartDate AND @EndDate GROUP BY w.id, w.name"; return conn.Query(sql, new { StartDate = startDate, EndDate = endDate }).ToList(); @@ -81,9 +101,10 @@ namespace CncRepository.Impl.Dashboard var sql = @" SELECT m.id AS MachineId, m.name AS MachineName, - COALESCE(SUM(dp.total_quantity),0) AS Quantity + COALESCE(SUM(CASE WHEN dp.is_settled=1 THEN dp.quantity + ELSE COALESCE(dp.end_part_count,dp.start_part_count) - dp.start_part_count END), 0) AS Quantity FROM cnc_machine m - LEFT JOIN cnc_daily_production dp ON dp.machine_id = m.id + LEFT JOIN cnc_production_segment dp ON dp.machine_id = m.id AND dp.production_date BETWEEN @StartDate AND @EndDate GROUP BY m.id, m.name ORDER BY Quantity DESC @@ -99,10 +120,11 @@ namespace CncRepository.Impl.Dashboard { var sql = @" SELECT w.name AS WorkerName, - COALESCE(SUM(dp.total_quantity),0) AS Quantity + COALESCE(SUM(CASE WHEN dp.is_settled=1 THEN dp.quantity + ELSE COALESCE(dp.end_part_count,dp.start_part_count) - dp.start_part_count END), 0) AS Quantity FROM cnc_worker w LEFT JOIN cnc_worker_machine wm ON wm.worker_id = w.id - LEFT JOIN cnc_daily_production dp ON dp.machine_id = wm.machine_id + LEFT JOIN cnc_production_segment dp ON dp.machine_id = wm.machine_id AND dp.production_date BETWEEN @StartDate AND @EndDate GROUP BY w.id, w.name ORDER BY Quantity DESC @@ -116,8 +138,10 @@ namespace CncRepository.Impl.Dashboard { using (var conn = CreateConnection()) { - var sql = @"SELECT production_date AS Date, COALESCE(SUM(total_quantity),0) AS Quantity - FROM cnc_daily_production + var sql = @"SELECT production_date AS Date, + COALESCE(SUM(CASE WHEN is_settled=1 THEN quantity + ELSE COALESCE(end_part_count,start_part_count) - start_part_count END), 0) AS Quantity + FROM cnc_production_segment WHERE production_date >= DATE_SUB(CURDATE(), INTERVAL @Days DAY) GROUP BY production_date ORDER BY production_date ASC";