重构仪表盘产量查询:全部从cnc_production_segment改为只读cnc_daily_production表,移除UNION和NOT EXISTS逻辑

main
haoliang 1 month ago
parent d8d5fe32b8
commit b1f487c077

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

Loading…
Cancel
Save