You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
hwmom/ruoyi-modules/hwmom-dms/sp_calc_dms_report_device_e...

454 lines
22 KiB
Transact-SQL

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

ALTER PROCEDURE [dbo].[sp_calc_dms_report_device_efficiency]
@StatDate DATE,
@TenantId VARCHAR(64) = '000000',
@WorkshopId BIGINT = NULL,
@ClassTeamId BIGINT = NULL,
@ShiftId BIGINT = NULL
AS
BEGIN
SET NOCOUNT ON;
-- 统计日期缺省处理:为空或占位值(1900-01-01)时,默认使用当天日期
IF @StatDate IS NULL OR @StatDate = '1900-01-01'
BEGIN
SET @StatDate = CAST(GETDATE() AS DATE);
END
-- 基本范围校验DATE 支持 0001-01-01 至 9999-12-31
IF @StatDate < '0001-01-01' OR @StatDate > '9999-12-31'
BEGIN
RAISERROR('StatDate out of range for date', 16, 1);
RETURN;
END
DECLARE @Start DATETIME2(0) = CAST(@StatDate AS DATETIME2(0));
DECLARE @End DATETIME2(0) = DATEADD(DAY, 1, @Start);
-- 调试:打印关键入参与时间窗
PRINT N'[sp_calc_dms_report_device_efficiency] 调试开始';
PRINT N'参数 StatDate=' + CONVERT(varchar(10), @StatDate, 120)
+ N'; Start=' + CONVERT(varchar(19), @Start, 120)
+ N'; End=' + CONVERT(varchar(19), @End, 120);
-- 归一化租户号:若为空字符串或 NULL则使用默认 '000000'
IF @TenantId IS NULL OR LTRIM(RTRIM(@TenantId)) = '' SET @TenantId = '000000';
PRINT N'租户 TenantId=' + @TenantId;
-- 将传入维度参数中的 0 归一化为 NULL表示不筛选
IF @WorkshopId = 0 SET @WorkshopId = NULL;
IF @ClassTeamId = 0 SET @ClassTeamId = NULL;
IF @ShiftId = 0 SET @ShiftId = NULL;
PRINT N'过滤维度(归一化) WorkshopId=' + COALESCE(CONVERT(varchar(20), @WorkshopId), N'NULL')
+ N', ClassTeamId=' + COALESCE(CONVERT(varchar(20), @ClassTeamId), N'NULL')
+ N', ShiftId=' + COALESCE(CONVERT(varchar(20), @ShiftId), N'NULL');
-- 删除当日同维度既有数据避免重复需在CTE之前执行否则CTE作用域只对紧邻下一条语句有效
DELETE t
FROM dbo.dms_report_device_efficiency t
WHERE t.stat_date = @StatDate
AND t.tenant_id = @TenantId
AND (@WorkshopId IS NULL OR t.workshop_id = @WorkshopId)
AND (@ClassTeamId IS NULL OR t.class_team_id = @ClassTeamId)
AND (@ShiftId IS NULL OR t.shift_id = @ShiftId);
-- 维度过滤条件(改为基于 dms_realtime_status_history 的相邻记录时间窗)
;WITH hist AS (
SELECT
h.tenant_id,
h.machine_id,
h.status_code,
h.status_name,
h.status_value,
h.sync_time,
LEAD(h.sync_time) OVER (PARTITION BY h.machine_id ORDER BY h.sync_time) AS next_sync_time
FROM dbo.dms_realtime_status_history h WITH (NOLOCK)
WHERE h.tenant_id = @TenantId
), state_raw AS (
SELECT
h.tenant_id,
m.workshop_id,
CAST(NULL AS BIGINT) AS class_team_id,
CAST(NULL AS BIGINT) AS shift_id,
h.machine_id,
-- 将实时状态映射到运行类型0运行、1待机、2故障、3停机、4调试
CASE
WHEN UPPER(h.status_code) IN ('RUN','RUNNING') OR h.status_name LIKE N'%运行%' OR UPPER(coalesce(h.status_value,'')) IN ('1','RUN','RUNNING') THEN '0'
WHEN UPPER(h.status_code) IN ('IDLE','STANDBY') OR h.status_name LIKE N'%待机%' THEN '1'
WHEN UPPER(h.status_code) IN ('FAULT','ALARM') OR h.status_name LIKE N'%故障%' THEN '2'
WHEN UPPER(h.status_code) IN ('STOP','OFF','SHUTDOWN') OR h.status_name LIKE N'%停机%' THEN '3'
WHEN UPPER(h.status_code) IN ('DEBUG','SETUP') OR h.status_name LIKE N'%调试%' THEN '4'
ELSE NULL
END AS state_type,
-- 计算与统计日期的时间窗重叠秒数(以相邻快照作为区间)
CASE WHEN COALESCE(h.next_sync_time, @End) > h.sync_time THEN
DATEDIFF_BIG(SECOND,
CASE WHEN h.sync_time < @Start THEN @Start ELSE h.sync_time END,
CASE WHEN COALESCE(h.next_sync_time, @End) > @End THEN @End ELSE COALESCE(h.next_sync_time, @End) END)
ELSE 0 END AS overlap_seconds
FROM hist h
LEFT JOIN dbo.prod_base_machine_info m WITH (NOLOCK) ON m.machine_id = h.machine_id
WHERE h.sync_time < @End
AND COALESCE(h.next_sync_time, @End) > @Start
AND (@WorkshopId IS NULL OR m.workshop_id = @WorkshopId)
-- 注class_team_id 与 shift_id 无法从实时状态历史推断,保留为 NULL
), state_hours AS (
SELECT
tenant_id,
workshop_id,
class_team_id,
shift_id,
machine_id,
SUM(CASE WHEN state_type = '4' THEN overlap_seconds ELSE 0 END) / 3600.0 AS debug_hours,
SUM(CASE WHEN state_type = '0' THEN overlap_seconds ELSE 0 END) / 3600.0 AS run_hours,
SUM(CASE WHEN state_type = '1' THEN overlap_seconds ELSE 0 END) / 3600.0 AS standby_hours,
SUM(CASE WHEN state_type = '2' THEN overlap_seconds ELSE 0 END) / 3600.0 AS fault_hours,
SUM(CASE WHEN state_type = '3' THEN overlap_seconds ELSE 0 END) / 3600.0 AS shutdown_hours
FROM state_raw
WHERE overlap_seconds > 0
GROUP BY tenant_id, workshop_id, class_team_id, shift_id, machine_id
), output_cte AS (
-- 产量来源prod_input_scan_info以 feeding_time 优先,其次 create_time按机台/车间维度计数
SELECT
p.tenant_id,
m.workshop_id,
CAST(NULL AS BIGINT) AS class_team_id,
CAST(NULL AS BIGINT) AS shift_id,
p.machine_id,
COUNT(1) AS output_qty
FROM dbo.prod_input_scan_info p WITH (NOLOCK)
LEFT JOIN dbo.prod_base_machine_info m WITH (NOLOCK) ON m.machine_id = p.machine_id
WHERE COALESCE(p.feeding_time, p.create_time) >= @Start AND COALESCE(p.feeding_time, p.create_time) < @End
AND p.tenant_id = @TenantId
AND (@WorkshopId IS NULL OR m.workshop_id = @WorkshopId)
GROUP BY p.tenant_id, m.workshop_id, p.machine_id
), std_cte AS (
-- 标准机时来源:机台工序关联 + 工序单位生产时间(秒)换算小时
SELECT
mp.machine_id,
CAST(ISNULL(pi.production_time, 0) / 3600.0 AS decimal(18,6)) AS process_std_machine_hours
FROM dbo.prod_base_machine_process mp WITH (NOLOCK)
LEFT JOIN dbo.prod_base_process_info pi WITH (NOLOCK) ON pi.process_id = mp.process_id
WHERE mp.tenant_id = @TenantId
), agg AS (
SELECT
sh.tenant_id,
@StatDate AS stat_date,
sh.workshop_id,
sh.class_team_id,
sh.shift_id,
sh.machine_id,
w.workshop_name,
ct.team_name AS class_team_name,
sft.shift_name,
mi.machine_name,
ISNULL(o.output_qty, 0) AS output_qty,
ISNULL(s.process_std_machine_hours, 0) AS process_std_machine_hours,
sh.debug_hours,
sh.run_hours,
sh.standby_hours,
sh.fault_hours,
sh.shutdown_hours
FROM state_hours sh
LEFT JOIN output_cte o ON o.tenant_id = sh.tenant_id AND o.workshop_id = sh.workshop_id AND o.class_team_id = sh.class_team_id AND o.shift_id = sh.shift_id AND o.machine_id = sh.machine_id
LEFT JOIN std_cte s ON s.machine_id = sh.machine_id
LEFT JOIN dbo.prod_base_workshop_info w WITH (NOLOCK) ON w.workshop_id = sh.workshop_id
LEFT JOIN dbo.base_class_team_info ct WITH (NOLOCK) ON ct.class_team_id = sh.class_team_id
LEFT JOIN dbo.base_shift_info sft WITH (NOLOCK) ON sft.shift_id = sh.shift_id
LEFT JOIN dbo.prod_base_machine_info mi WITH (NOLOCK) ON mi.machine_id = sh.machine_id
)
-- 将聚合结果落到临时表,便于调试查看
SELECT
a.tenant_id, a.stat_date, a.workshop_id, a.class_team_id, a.shift_id, a.machine_id,
a.workshop_name, a.class_team_name, a.shift_name, a.machine_name,
a.output_qty, a.process_std_machine_hours,
CAST(a.debug_hours AS decimal(18,6)) AS debug_hours,
CAST(a.run_hours AS decimal(18,6)) AS run_hours,
CAST(a.standby_hours AS decimal(18,6)) AS standby_hours,
CAST(a.fault_hours AS decimal(18,6)) AS fault_hours,
CAST(a.shutdown_hours AS decimal(18,6)) AS shutdown_hours
INTO #agg
FROM agg a;
-- 调试:预览聚合数据结构与部分记录
PRINT N'聚合结果预览TOP 20';
SELECT TOP (20) * FROM #agg ORDER BY machine_id;
PRINT N'聚合结果概要统计';
SELECT
COUNT(*) AS rows,
SUM(output_qty) AS sum_output_qty,
SUM(process_std_machine_hours) AS sum_std_hours,
SUM(run_hours) AS sum_run_hours,
SUM(standby_hours) AS sum_standby_hours,
SUM(fault_hours) AS sum_fault_hours,
SUM(shutdown_hours) AS sum_shutdown_hours
FROM #agg;
-- 进一步调试:分别查看 state_raw / state_hours 的行数与示例,定位空结果来源
PRINT N'state_raw 行计数与示例(窗口与租户过滤后)';
;WITH hist2 AS (
SELECT
h.tenant_id,
h.machine_id,
h.status_code,
h.status_name,
h.status_value,
h.sync_time,
LEAD(h.sync_time) OVER (PARTITION BY h.machine_id ORDER BY h.sync_time) AS next_sync_time
FROM dbo.dms_realtime_status_history h WITH (NOLOCK)
WHERE h.tenant_id = @TenantId
), state_raw2 AS (
SELECT
h.tenant_id,
m.workshop_id,
CAST(NULL AS BIGINT) AS class_team_id,
CAST(NULL AS BIGINT) AS shift_id,
h.machine_id,
CASE
WHEN UPPER(h.status_code) IN ('RUN','RUNNING') OR h.status_name LIKE N'%运行%' OR UPPER(coalesce(h.status_value,'')) IN ('1','RUN','RUNNING') THEN '0'
WHEN UPPER(h.status_code) IN ('IDLE','STANDBY') OR h.status_name LIKE N'%待机%' THEN '1'
WHEN UPPER(h.status_code) IN ('FAULT','ALARM') OR h.status_name LIKE N'%故障%' THEN '2'
WHEN UPPER(h.status_code) IN ('STOP','OFF','SHUTDOWN') OR h.status_name LIKE N'%停机%' THEN '3'
WHEN UPPER(h.status_code) IN ('DEBUG','SETUP') OR h.status_name LIKE N'%调试%' THEN '4'
ELSE NULL
END AS state_type,
CASE WHEN COALESCE(h.next_sync_time, @End) > h.sync_time THEN
DATEDIFF_BIG(SECOND,
CASE WHEN h.sync_time < @Start THEN @Start ELSE h.sync_time END,
CASE WHEN COALESCE(h.next_sync_time, @End) > @End THEN @End ELSE COALESCE(h.next_sync_time, @End) END)
ELSE 0 END AS overlap_seconds,
h.sync_time, COALESCE(h.next_sync_time, @End) AS next_sync_time
FROM hist2 h
LEFT JOIN dbo.prod_base_machine_info m WITH (NOLOCK) ON m.machine_id = h.machine_id
WHERE h.sync_time < @End
AND COALESCE(h.next_sync_time, @End) > @Start
AND (@WorkshopId IS NULL OR m.workshop_id = @WorkshopId)
)
SELECT COUNT(*) AS state_raw_rows,
SUM(CASE WHEN overlap_seconds > 0 THEN 1 ELSE 0 END) AS positive_overlap_rows,
COUNT(DISTINCT machine_id) AS distinct_machines
FROM state_raw2;
;WITH hist2 AS (
SELECT
h.tenant_id,
h.machine_id,
h.status_code,
h.status_name,
h.status_value,
h.sync_time,
LEAD(h.sync_time) OVER (PARTITION BY h.machine_id ORDER BY h.sync_time) AS next_sync_time
FROM dbo.dms_realtime_status_history h WITH (NOLOCK)
WHERE h.tenant_id = @TenantId
), state_raw2 AS (
SELECT
h.tenant_id,
m.workshop_id,
CAST(NULL AS BIGINT) AS class_team_id,
CAST(NULL AS BIGINT) AS shift_id,
h.machine_id,
CASE
WHEN UPPER(h.status_code) IN ('RUN','RUNNING') OR h.status_name LIKE N'%运行%' OR UPPER(coalesce(h.status_value,'')) IN ('1','RUN','RUNNING') THEN '0'
WHEN UPPER(h.status_code) IN ('IDLE','STANDBY') OR h.status_name LIKE N'%待机%' THEN '1'
WHEN UPPER(h.status_code) IN ('FAULT','ALARM') OR h.status_name LIKE N'%故障%' THEN '2'
WHEN UPPER(h.status_code) IN ('STOP','OFF','SHUTDOWN') OR h.status_name LIKE N'%停机%' THEN '3'
WHEN UPPER(h.status_code) IN ('DEBUG','SETUP') OR h.status_name LIKE N'%调试%' THEN '4'
ELSE NULL
END AS state_type,
CASE WHEN COALESCE(h.next_sync_time, @End) > h.sync_time THEN
DATEDIFF_BIG(SECOND,
CASE WHEN h.sync_time < @Start THEN @Start ELSE h.sync_time END,
CASE WHEN COALESCE(h.next_sync_time, @End) > @End THEN @End ELSE COALESCE(h.next_sync_time, @End) END)
ELSE 0 END AS overlap_seconds,
h.sync_time, COALESCE(h.next_sync_time, @End) AS next_sync_time
FROM hist2 h
LEFT JOIN dbo.prod_base_machine_info m WITH (NOLOCK) ON m.machine_id = h.machine_id
WHERE h.sync_time < @End
AND COALESCE(h.next_sync_time, @End) > @Start
AND (@WorkshopId IS NULL OR m.workshop_id = @WorkshopId)
)
SELECT TOP (10)
tenant_id, workshop_id, machine_id, state_type, overlap_seconds,
sync_time, next_sync_time
FROM state_raw2
ORDER BY machine_id, sync_time;
PRINT N'state_hours 行计数与示例';
;WITH hist3 AS (
SELECT
h.tenant_id,
h.machine_id,
h.status_code,
h.status_name,
h.status_value,
h.sync_time,
LEAD(h.sync_time) OVER (PARTITION BY h.machine_id ORDER BY h.sync_time) AS next_sync_time
FROM dbo.dms_realtime_status_history h WITH (NOLOCK)
WHERE h.tenant_id = @TenantId
), state_raw3 AS (
SELECT
h.tenant_id,
m.workshop_id,
CAST(NULL AS BIGINT) AS class_team_id,
CAST(NULL AS BIGINT) AS shift_id,
h.machine_id,
CASE
WHEN UPPER(h.status_code) IN ('RUN','RUNNING') OR h.status_name LIKE N'%运行%' OR UPPER(coalesce(h.status_value,'')) IN ('1','RUN','RUNNING') THEN '0'
WHEN UPPER(h.status_code) IN ('IDLE','STANDBY') OR h.status_name LIKE N'%待机%' THEN '1'
WHEN UPPER(h.status_code) IN ('FAULT','ALARM') OR h.status_name LIKE N'%故障%' THEN '2'
WHEN UPPER(h.status_code) IN ('STOP','OFF','SHUTDOWN') OR h.status_name LIKE N'%停机%' THEN '3'
WHEN UPPER(h.status_code) IN ('DEBUG','SETUP') OR h.status_name LIKE N'%调试%' THEN '4'
ELSE NULL
END AS state_type,
CASE WHEN COALESCE(h.next_sync_time, @End) > h.sync_time THEN
DATEDIFF_BIG(SECOND,
CASE WHEN h.sync_time < @Start THEN @Start ELSE h.sync_time END,
CASE WHEN COALESCE(h.next_sync_time, @End) > @End THEN @End ELSE COALESCE(h.next_sync_time, @End) END)
ELSE 0 END AS overlap_seconds
FROM hist3 h
LEFT JOIN dbo.prod_base_machine_info m WITH (NOLOCK) ON m.machine_id = h.machine_id
WHERE h.sync_time < @End
AND COALESCE(h.next_sync_time, @End) > @Start
AND (@WorkshopId IS NULL OR m.workshop_id = @WorkshopId)
), state_hours3 AS (
SELECT
tenant_id,
workshop_id,
class_team_id,
shift_id,
machine_id,
SUM(CASE WHEN state_type = '4' THEN overlap_seconds ELSE 0 END) / 3600.0 AS debug_hours,
SUM(CASE WHEN state_type = '0' THEN overlap_seconds ELSE 0 END) / 3600.0 AS run_hours,
SUM(CASE WHEN state_type = '1' THEN overlap_seconds ELSE 0 END) / 3600.0 AS standby_hours,
SUM(CASE WHEN state_type = '2' THEN overlap_seconds ELSE 0 END) / 3600.0 AS fault_hours,
SUM(CASE WHEN state_type = '3' THEN overlap_seconds ELSE 0 END) / 3600.0 AS shutdown_hours
FROM state_raw3
WHERE overlap_seconds > 0
GROUP BY tenant_id, workshop_id, class_team_id, shift_id, machine_id
)
SELECT COUNT(*) AS state_hours_rows,
SUM(run_hours) AS sum_run_hours,
SUM(standby_hours) AS sum_standby_hours,
SUM(fault_hours) AS sum_fault_hours,
SUM(shutdown_hours) AS sum_shutdown_hours
FROM state_hours3;
;WITH hist3 AS (
SELECT
h.tenant_id,
h.machine_id,
h.status_code,
h.status_name,
h.status_value,
h.sync_time,
LEAD(h.sync_time) OVER (PARTITION BY h.machine_id ORDER BY h.sync_time) AS next_sync_time
FROM dbo.dms_realtime_status_history h WITH (NOLOCK)
WHERE h.tenant_id = @TenantId
), state_raw3 AS (
SELECT
h.tenant_id,
m.workshop_id,
CAST(NULL AS BIGINT) AS class_team_id,
CAST(NULL AS BIGINT) AS shift_id,
h.machine_id,
CASE
WHEN UPPER(h.status_code) IN ('RUN','RUNNING') OR h.status_name LIKE N'%运行%' OR UPPER(coalesce(h.status_value,'')) IN ('1','RUN','RUNNING') THEN '0'
WHEN UPPER(h.status_code) IN ('IDLE','STANDBY') OR h.status_name LIKE N'%待机%' THEN '1'
WHEN UPPER(h.status_code) IN ('FAULT','ALARM') OR h.status_name LIKE N'%故障%' THEN '2'
WHEN UPPER(h.status_code) IN ('STOP','OFF','SHUTDOWN') OR h.status_name LIKE N'%停机%' THEN '3'
WHEN UPPER(h.status_code) IN ('DEBUG','SETUP') OR h.status_name LIKE N'%调试%' THEN '4'
ELSE NULL
END AS state_type,
CASE WHEN COALESCE(h.next_sync_time, @End) > h.sync_time THEN
DATEDIFF_BIG(SECOND,
CASE WHEN h.sync_time < @Start THEN @Start ELSE h.sync_time END,
CASE WHEN COALESCE(h.next_sync_time, @End) > @End THEN @End ELSE COALESCE(h.next_sync_time, @End) END)
ELSE 0 END AS overlap_seconds
FROM hist3 h
LEFT JOIN dbo.prod_base_machine_info m WITH (NOLOCK) ON m.machine_id = h.machine_id
WHERE h.sync_time < @End
AND COALESCE(h.next_sync_time, @End) > @Start
AND (@WorkshopId IS NULL OR m.workshop_id = @WorkshopId)
), state_hours3 AS (
SELECT
tenant_id,
workshop_id,
class_team_id,
shift_id,
machine_id,
SUM(CASE WHEN state_type = '4' THEN overlap_seconds ELSE 0 END) / 3600.0 AS debug_hours,
SUM(CASE WHEN state_type = '0' THEN overlap_seconds ELSE 0 END) / 3600.0 AS run_hours,
SUM(CASE WHEN state_type = '1' THEN overlap_seconds ELSE 0 END) / 3600.0 AS standby_hours,
SUM(CASE WHEN state_type = '2' THEN overlap_seconds ELSE 0 END) / 3600.0 AS fault_hours,
SUM(CASE WHEN state_type = '3' THEN overlap_seconds ELSE 0 END) / 3600.0 AS shutdown_hours
FROM state_raw3
WHERE overlap_seconds > 0
GROUP BY tenant_id, workshop_id, class_team_id, shift_id, machine_id
)
SELECT TOP (10)
tenant_id, workshop_id, machine_id,
debug_hours, run_hours, standby_hours, fault_hours, shutdown_hours
FROM state_hours3
ORDER BY machine_id;
-- 调试关键数据源与聚合行数计数定位“插入为0”的原因
PRINT N'历史数据计数(当日窗口)';
SELECT
COUNT(*) AS hist_rows,
COUNT(DISTINCT h.machine_id) AS hist_machines
FROM dbo.dms_realtime_status_history h
WHERE h.tenant_id = @TenantId
AND h.sync_time >= @Start AND h.sync_time < @End;
PRINT N'历史数据示例TOP 10';
SELECT TOP (10)
h.machine_id, h.status_code, h.status_name, h.status_value, h.sync_time
FROM dbo.dms_realtime_status_history h
WHERE h.tenant_id = @TenantId
AND h.sync_time >= @Start AND h.sync_time < @End
ORDER BY h.sync_time;
PRINT N'聚合行数统计';
SELECT COUNT(*) AS agg_rows FROM #agg;
-- 写入汇总(计算指标)
DECLARE @inserted_rows INT;
INSERT INTO dbo.dms_report_device_efficiency (
tenant_id, stat_date, workshop_id, class_team_id, shift_id, machine_id,
workshop_name, class_team_name, shift_name, machine_name,
output_qty, process_std_machine_hours,
debug_hours, run_hours, standby_hours, fault_hours, shutdown_hours,
output_machine_hours, total_hours, uptime_rate, overall_efficiency, runtime_efficiency,
create_time
)
SELECT
g.tenant_id, g.stat_date, g.workshop_id, g.class_team_id, g.shift_id, g.machine_id,
g.workshop_name, g.class_team_name, g.shift_name, g.machine_name,
g.output_qty, g.process_std_machine_hours,
g.debug_hours,
g.run_hours,
g.standby_hours,
g.fault_hours,
g.shutdown_hours,
-- 产出机时
CAST(g.output_qty * g.process_std_machine_hours AS decimal(18,6)) AS output_machine_hours,
-- 合计时长
CAST(g.run_hours + g.standby_hours + g.fault_hours AS decimal(18,6)) AS total_hours,
-- 开机率
CAST((g.run_hours + g.debug_hours) / NULLIF((g.run_hours + g.standby_hours + g.fault_hours), 0) AS decimal(18,6)) AS uptime_rate,
-- 综合效率
CAST((g.output_qty * g.process_std_machine_hours) / NULLIF((g.run_hours + g.standby_hours + g.fault_hours + g.shutdown_hours + g.debug_hours), 0) AS decimal(18,6)) AS overall_efficiency,
-- 运行效率
CAST((g.output_qty * g.process_std_machine_hours) / NULLIF(g.run_hours, 0) AS decimal(18,6)) AS runtime_efficiency,
GETDATE()
FROM #agg g;
SET @inserted_rows = @@ROWCOUNT;
-- 调试:打印插入行数并预览插入数据
PRINT N'插入行数=' + CONVERT(varchar(20), @inserted_rows);
SELECT TOP (50) *
FROM dbo.dms_report_device_efficiency
WHERE stat_date = @StatDate
AND tenant_id = @TenantId
AND (@WorkshopId IS NULL OR workshop_id = @WorkshopId)
AND (@ClassTeamId IS NULL OR class_team_id = @ClassTeamId)
AND (@ShiftId IS NULL OR shift_id = @ShiftId)
ORDER BY machine_id;
END