Добавить reglament.sql

This commit is contained in:
2026-07-02 15:59:16 +00:00
parent f4527635b7
commit 3afa0cfd16
+182
View File
@@ -0,0 +1,182 @@
-- =============================================================================
-- Отчет по регламентным работам для периферийного оборудования (на месяц)
-- =============================================================================
WITH
-- 1. Получаем уникальные устройства из Zabbix и размножаем их
devices_raw AS (
SELECT DISTINCT
h.host AS host_name,
COALESCE(h.name, h.host) AS visible_name,
COALESCE(hinv."name", 'не указан') AS equipment_type,
COALESCE(hinv.notes, '') AS object_number,
CASE
WHEN hinv.location_lat IS NOT NULL AND hinv.location_lon IS NOT NULL
AND hinv.location_lat != '' AND hinv.location_lon != ''
THEN hinv.location_lat || ' / ' || hinv.location_lon
WHEN hinv.location_lat IS NOT NULL AND hinv.location_lat != ''
THEN hinv.location_lat
WHEN hinv.location_lon IS NOT NULL AND hinv.location_lon != ''
THEN hinv.location_lon
ELSE ''
END AS coordinates,
CAST(nullif(regexp_replace(hinv.notes, 'ОБЪЕКТ №\s*', '', 'g'),'') AS INTEGER) AS object_num
FROM hosts h
LEFT JOIN host_inventory hinv
ON hinv.hostid = h.hostid
WHERE
h.status = 0
AND h.host NOT LIKE '%WiMAX'
AND hinv."name" NOT LIKE '%Датчик дорожного полотна%'
AND hinv."name" != 'Дорожный контроллер Синтез-Д'
AND (CAST(nullif(regexp_replace(hinv.notes, 'ОБЪЕКТ №\s*', '', 'g'),'') AS INTEGER)
IN (1,2,4,5,8,9,11,12,14,24,25,27,28,29,30,31,32,34,35,36,38,40,41,42,43,44,45,46,48,49,50,51,53,54,55,57,58,60,62,63,64,65,66,67,68,69,70,76,77,81,82,84,85)
OR CAST(nullif(regexp_replace(hinv.notes, 'ОБЪЕКТ №\s*', '', 'g'),'') AS INTEGER)
IN (16,39,75,23))
AND h.hostid != 10725
AND (
hinv."name" LIKE '%Видеокамера%'
OR hinv."name" LIKE '%Маршрутизатор%'
OR hinv."name" LIKE '%Детектор%'
OR hinv."name" LIKE '%Метеостанция%'
OR hinv."name" LIKE '%Коммутационный шкаф%'
)
),
-- Размножаем устройства: если есть Маршрутизатор и Коммутационный шкаф, создаем две записи
devices AS (
-- Видеокамеры
SELECT
host_name,
visible_name,
equipment_type,
'Видеокамера' AS report_type,
equipment_type AS full_equipment_name,
object_number,
coordinates,
object_num
FROM devices_raw
WHERE equipment_type LIKE '%Видеокамера%'
UNION ALL
-- Детекторы
SELECT
host_name,
visible_name,
equipment_type,
'Детектор' AS report_type,
equipment_type AS full_equipment_name,
object_number,
coordinates,
object_num
FROM devices_raw
WHERE equipment_type LIKE '%Детектор%'
UNION ALL
-- Маршрутизаторы (если есть слово Маршрутизатор)
SELECT
host_name,
visible_name,
equipment_type,
'Маршрутизатор' AS report_type,
REGEXP_REPLACE(equipment_type, '/ Коммутационный шкаф.*$', '') AS full_equipment_name,
object_number,
coordinates,
object_num
FROM devices_raw
WHERE equipment_type LIKE '%Маршрутизатор%'
UNION ALL
-- Коммутационные шкафы (если есть слово Коммутационный шкаф)
SELECT
host_name,
visible_name,
equipment_type,
'Коммутационный шкаф' AS report_type,
'Коммутационный шкаф' AS full_equipment_name,
object_number,
coordinates,
object_num
FROM devices_raw
WHERE equipment_type LIKE '%Коммутационный шкаф%'
UNION ALL
-- Метеостанции
SELECT
host_name,
visible_name,
equipment_type,
'Метеостанция' AS report_type,
equipment_type AS full_equipment_name,
object_number,
coordinates,
object_num
FROM devices_raw
WHERE equipment_type LIKE '%Метеостанция%'
),
-- 2. Соединяем устройства с регламентными работами
report_base AS (
SELECT
d.host_name,
d.visible_name,
d.equipment_type,
d.report_type,
d.full_equipment_name,
d.object_number,
d.coordinates,
d.object_num,
TO_CHAR(
CASE
WHEN ${end_dt} IS NOT NULL THEN to_date(${end_dt}, 'yyyymmdd')
ELSE NOW()::date
END,
'DD.MM.YYYY'
) AS report_date,
r.briefdescription AS work_description,
r."Result" AS work_result,
ROW_NUMBER() OVER (
PARTITION BY d.host_name, d.report_type
ORDER BY r.briefdescription
) AS work_num
FROM devices d
CROSS JOIN report.reglamentsuka r
WHERE
d.report_type = r."type"
)
-- 3. Финальный вывод
SELECT
ROW_NUMBER() OVER (
ORDER BY
object_num NULLS LAST,
CASE report_type
WHEN 'Видеокамера' THEN 1
WHEN 'Детектор' THEN 2
WHEN 'Маршрутизатор' THEN 3
WHEN 'Коммутационный шкаф' THEN 4
WHEN 'Метеостанция' THEN 5
ELSE 6
END,
host_name,
work_num
) AS "№ п/п",
-- Формируем название оборудования
CASE
WHEN report_type = 'Коммутационный шкаф' THEN 'Коммутационный шкаф'
WHEN report_type = 'Маршрутизатор' THEN 'Маршрутизатор'
WHEN report_type IN ('Видеокамера', 'Детектор', 'Метеостанция')
THEN full_equipment_name
ELSE full_equipment_name
END AS "Оборудование",
object_num AS "Объект",
coordinates AS "Координаты",
work_description AS "Описание_работ",
report_date AS "Дата",
work_result AS "Результат"
FROM report_base
ORDER BY "№ п/п";