@ -17,31 +17,7 @@ namespace CncRepository.Impl.Dashboard
{
public DashboardRepository ( string connectionString ) : base ( connectionString ) { }
/// <summary>
/// 通用产量计算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 ";
// 产量查询现已统一使用 cnc_daily_production 表,不再需要 cnc_production_segment UNION
/// <summary>汇总卡片数据</summary>
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 totalMachines = conn . ExecuteScalar < int > ( @"SELECT COUNT(1) FROM cnc_machine WHERE is_enabled = 1" ) ;
// 今日总产量: 直接从产量分段实时计算(今日一定没有日终汇总)
// 今日总产量: 从 cnc_daily_production 汇总
var todayProduction = conn . ExecuteScalar < int > ( @ "
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 < int > ( @"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 < WorkshopProductionResponse > ( 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 < ProgramRankItem > ( 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 < ProgramDistributionItem > ( sql , new { StartDate = startDate , EndDate = endDate , Top = top } ) . ToList ( ) ;