From b1f487c077a65de14ebb90c6e7cee92588102969 Mon Sep 17 00:00:00 2001
From: haoliang <821644@qq.com>
Date: Thu, 14 May 2026 22:09:39 +0800
Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BB=AA=E8=A1=A8=E7=9B=98?=
=?UTF-8?q?=E4=BA=A7=E9=87=8F=E6=9F=A5=E8=AF=A2=EF=BC=9A=E5=85=A8=E9=83=A8?=
=?UTF-8?q?=E4=BB=8Ecnc=5Fproduction=5Fsegment=E6=94=B9=E4=B8=BA=E5=8F=AA?=
=?UTF-8?q?=E8=AF=BBcnc=5Fdaily=5Fproduction=E8=A1=A8=EF=BC=8C=E7=A7=BB?=
=?UTF-8?q?=E9=99=A4UNION=E5=92=8CNOT=20EXISTS=E9=80=BB=E8=BE=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Impl/Dashboard/DashboardRepository.cs | 153 +++++-------------
1 file changed, 38 insertions(+), 115 deletions(-)
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();