docs: add shadow v3 field operations package

This commit is contained in:
zgw
2026-09-03 17:08:13 +08:00
parent 169b64850d
commit 47190451ff
8 changed files with 748 additions and 249 deletions

View File

@@ -0,0 +1,190 @@
:on error exit
:out "$(OutputDir)\sql-diagnostics.txt"
SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT CAST(SERVERPROPERTY('ProductVersion') AS varchar(30)) AS product_version,
DB_NAME() AS database_name,
SYSUTCDATETIME() AS checked_at_utc,
CONVERT(datetime2(3), '$(StartUtc)', 127) AS export_start_utc,
'$(WarehouseId)' AS warehouse_id;
SELECT package_id, package_version, installed_at
FROM alg.shadow_package_manifest;
SELECT warehouse_id, snapshot_generation, snapshot_status, synchronized_at,
DATEDIFF(SECOND, synchronized_at, SYSUTCDATETIME()) AS snapshot_age_seconds,
CONVERT(varchar(64), source_signature, 2) AS source_signature,
source_row_count, instance_id, last_error
FROM alg.shadow_snapshot_state
WHERE warehouse_id = '$(WarehouseId)';
SELECT warehouse_id, instance_id, claimed_at, last_seen_at,
DATEDIFF(SECOND, last_seen_at, SYSUTCDATETIME()) AS heartbeat_age_seconds
FROM alg.shadow_instance_heartbeat
WHERE warehouse_id = '$(WarehouseId)';
SELECT 'cargo_space_snapshot' AS entity_name, state.snapshot_generation,
COUNT_BIG(snapshot.space_id) AS row_count
FROM alg.shadow_snapshot_state state
LEFT JOIN alg.cargo_space_snapshot snapshot
ON snapshot.warehouse_id = state.warehouse_id
AND snapshot.snapshot_generation = state.snapshot_generation
WHERE state.warehouse_id = '$(WarehouseId)'
GROUP BY state.snapshot_generation
UNION ALL
SELECT 'active_job_snapshot', state.snapshot_generation, COUNT_BIG(snapshot.job_id)
FROM alg.shadow_snapshot_state state
LEFT JOIN alg.active_job_snapshot snapshot
ON snapshot.warehouse_id = state.warehouse_id
AND snapshot.snapshot_generation = state.snapshot_generation
WHERE state.warehouse_id = '$(WarehouseId)'
GROUP BY state.snapshot_generation
UNION ALL
SELECT 'shadow_inbound_request_snapshot', state.snapshot_generation, COUNT_BIG(snapshot.task_no)
FROM alg.shadow_snapshot_state state
LEFT JOIN alg.shadow_inbound_request_snapshot snapshot
ON snapshot.warehouse_id = state.warehouse_id
AND snapshot.snapshot_generation = state.snapshot_generation
WHERE state.warehouse_id = '$(WarehouseId)'
GROUP BY state.snapshot_generation
UNION ALL
SELECT 'shadow_outbound_request_snapshot', state.snapshot_generation, COUNT_BIG(snapshot.stockout_detail_id)
FROM alg.shadow_snapshot_state state
LEFT JOIN alg.shadow_outbound_request_snapshot snapshot
ON snapshot.warehouse_id = state.warehouse_id
AND snapshot.snapshot_generation = state.snapshot_generation
WHERE state.warehouse_id = '$(WarehouseId)'
GROUP BY state.snapshot_generation;
SELECT request.session_id, request.blocking_session_id, request.status,
request.wait_type, request.wait_time, request.command,
SUBSTRING(sql_text.text,
(request.statement_start_offset / 2) + 1,
((CASE request.statement_end_offset
WHEN -1 THEN DATALENGTH(sql_text.text)
ELSE request.statement_end_offset
END - request.statement_start_offset) / 2) + 1) AS statement_text
FROM sys.dm_exec_requests request
OUTER APPLY sys.dm_exec_sql_text(request.sql_handle) sql_text
WHERE request.database_id = DB_ID()
AND (request.blocking_session_id <> 0 OR sql_text.text LIKE '%alg.%')
ORDER BY request.session_id;
GO
:out "$(OutputDir)\comparison-detail.txt"
SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT decision_type, result_code,
CASE
WHEN result_code = 'MATCH' THEN 'VALID_MATCH'
WHEN result_code = 'DIFFERENT' THEN 'VALID_DIFFERENT'
WHEN result_code LIKE 'SKIP_%' THEN 'SKIP'
WHEN result_code LIKE 'ERROR_%' THEN 'ERROR'
ELSE 'OTHER'
END AS outcome_group,
COUNT_BIG(*) AS row_count,
MIN(created_at) AS first_created_at,
MAX(created_at) AS last_created_at
FROM alg.decision_log
WHERE warehouse_id = '$(WarehouseId)'
AND created_at >= CONVERT(datetime2(3), '$(StartUtc)', 127)
GROUP BY decision_type, result_code,
CASE
WHEN result_code = 'MATCH' THEN 'VALID_MATCH'
WHEN result_code = 'DIFFERENT' THEN 'VALID_DIFFERENT'
WHEN result_code LIKE 'SKIP_%' THEN 'SKIP'
WHEN result_code LIKE 'ERROR_%' THEN 'ERROR'
ELSE 'OTHER'
END
ORDER BY decision_type, result_code;
SELECT decision_id, warehouse_id, decision_type, input_version,
result_code, reason, created_at
FROM alg.decision_log
WHERE warehouse_id = '$(WarehouseId)'
AND created_at >= CONVERT(datetime2(3), '$(StartUtc)', 127)
ORDER BY created_at, decision_id;
SELECT SUM(CASE WHEN decision_type = 'INBOUND' THEN 1 ELSE 0 END) AS inbound_plan_count,
SUM(CASE WHEN decision_type = 'INBOUND_COMPARE' THEN 1 ELSE 0 END) AS inbound_compare_count,
SUM(CASE WHEN decision_type = 'OUTBOUND' THEN 1 ELSE 0 END) AS outbound_plan_count,
SUM(CASE WHEN decision_type = 'OUTBOUND_COMPARE' THEN 1 ELSE 0 END) AS outbound_compare_count
FROM alg.decision_log
WHERE warehouse_id = '$(WarehouseId)'
AND created_at >= CONVERT(datetime2(3), '$(StartUtc)', 127);
GO
:out "$(OutputDir)\runtime-metrics.txt"
SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT warehouse_id, metric_name, bucket_upper_micros, metric_count,
metric_total_micros, metric_max_micros, flushed_at
FROM alg.shadow_runtime_metric
WHERE warehouse_id = '$(WarehouseId)'
ORDER BY metric_name, bucket_upper_micros;
SELECT CASE
WHEN metric_name LIKE 'SKIP_%' THEN 'SKIP'
WHEN metric_name LIKE 'ERROR_%' THEN 'ERROR'
WHEN metric_name = 'ADMITTED' THEN 'ADMITTED'
ELSE 'HISTOGRAM'
END AS metric_group,
SUM(metric_count) AS metric_count,
MAX(flushed_at) AS latest_flush_at
FROM alg.shadow_runtime_metric
WHERE warehouse_id = '$(WarehouseId)'
GROUP BY CASE
WHEN metric_name LIKE 'SKIP_%' THEN 'SKIP'
WHEN metric_name LIKE 'ERROR_%' THEN 'ERROR'
WHEN metric_name = 'ADMITTED' THEN 'ADMITTED'
ELSE 'HISTOGRAM'
END
ORDER BY metric_group;
GO
:out "$(OutputDir)\inventory-parity.txt"
SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
WITH legacy_stock AS (
SELECT stock.stock_id, stock.cargo_space_id, stock.tray_code,
stock.spare4 AS project_no, stock.product_id AS product_no,
stock.lot_no, stock.quantity, stock.out_quantity
FROM dbo.bas_stock stock WITH (NOLOCK)
INNER JOIN dbo.bas_cargo_space space WITH (NOLOCK)
ON space.cargo_space_id = stock.cargo_space_id
WHERE TRY_CONVERT(decimal(38,0), LTRIM(RTRIM(space.warehouse_id))) =
TRY_CONVERT(decimal(38,0), '$(WarehouseId)')
), shadow_stock AS (
SELECT snapshot.stock_id, snapshot.space_id AS cargo_space_id,
snapshot.tray_code, snapshot.project_no, snapshot.product_no,
snapshot.lot_no, snapshot.quantity, snapshot.out_quantity
FROM alg.inventory_item_snapshot snapshot
INNER JOIN alg.shadow_snapshot_state state
ON state.warehouse_id = snapshot.warehouse_id
AND state.snapshot_generation = snapshot.snapshot_generation
AND state.snapshot_status = 'PUBLISHED'
WHERE snapshot.warehouse_id = '$(WarehouseId)'
)
SELECT SUM(CASE WHEN legacy.stock_id IS NULL THEN 1 ELSE 0 END) AS shadow_only_count,
SUM(CASE WHEN shadow.stock_id IS NULL THEN 1 ELSE 0 END) AS legacy_only_count,
SUM(CASE WHEN legacy.stock_id IS NOT NULL AND shadow.stock_id IS NOT NULL
AND (ISNULL(legacy.cargo_space_id, '') <> ISNULL(shadow.cargo_space_id, '')
OR ISNULL(legacy.tray_code, '') <> ISNULL(shadow.tray_code, '')
OR ISNULL(legacy.project_no, '') <> ISNULL(shadow.project_no, '')
OR ISNULL(legacy.product_no, '') <> ISNULL(shadow.product_no, '')
OR ISNULL(legacy.lot_no, '') <> ISNULL(shadow.lot_no, '')
OR ISNULL(legacy.quantity, 0) <> ISNULL(shadow.quantity, 0)
OR ISNULL(legacy.out_quantity, 0) <> ISNULL(shadow.out_quantity, 0))
THEN 1 ELSE 0 END) AS differing_row_count,
COUNT_BIG(*) AS compared_stock_count
FROM legacy_stock legacy
FULL OUTER JOIN shadow_stock shadow ON shadow.stock_id = legacy.stock_id;
GO
:out stdout
SELECT 'EXPORT_SQL_OK' AS export_status, SYSUTCDATETIME() AS completed_at_utc;