@ -24,7 +24,11 @@ namespace CncRepository.Impl.Dashboard
{
var onlineCount = conn . ExecuteScalar < int > ( @"SELECT COUNT(1) FROM cnc_machine WHERE is_online = 1" ) ;
var totalMachines = conn . ExecuteScalar < int > ( @"SELECT COUNT(1) FROM cnc_machine" ) ;
var todayProduction = conn . ExecuteScalar < int > ( @"SELECT COALESCE(SUM(total_quantity),0) FROM cnc_daily_production WHERE production_date = CURDATE()" ) ;
// 今日总产量:直接从产量分段实时计算
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 ( ) ");
var activeAlerts = conn . ExecuteScalar < int > ( @"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 ) : 0 m ;
var todayCuttingTime = conn . ExecuteScalar < int > ( @"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 < decimal > ( @ "
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 < int > ( @"SELECT COUNT(1) FROM cnc_machine WHERE last_device_status = 'running'" ) ;
var dataMissingMachines = conn . ExecuteScalar < int > ( @"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 < WorkshopProductionResponse > ( 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 ";